【发布时间】:2016-08-19 01:45:49
【问题描述】:
我正在尝试在使用模板定义的 C++ 类成员函数处设置断点。我在stackoverflow中寻找了解决方案,但找不到同样的问题。下面是显示函数定义的示例代码(来自 py-faster-rcnn caffe 代码,Dtype 定义为外部浮点数)。
template <typename Dtype>
void SoftmaxWithLossLayer<Dtype>::Forward_gpu(
const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {
softmax_layer_->Forward(softmax_bottom_vec_, softmax_top_vec_);
const Dtype* prob_data = prob_.gpu_data();
const Dtype* label = bottom[1]->gpu_data();
昨天,我成功设置断点使用
br SoftmaxWithLossLayer<float>::Forward_gpu( const vector<Blob<float>*>& , const vector<Blob<float>*>& )
但是今天早上,它不起作用!可能是什么问题?如果我使用br filename:linenuber,它可以工作。
(顺便说一句,我正在使用附加到运行 python 的进程的 DDD,包括由 boost 包装的 C++ 库,但我希望这无关紧要。)
【问题讨论】:
-
调试模板一直是一个偶然的命题。根据我的经验,设置断点最可靠的方法是在文件+行号上,而不是在函数名上。
-
我从未尝试过,但您是否考虑过使用 nm 来确定它在共享库中的定义方式?您也许可以使用该信息来帮助 ddd/gdb 始终如一地找到模板方法。
-
@ClaudioCorsi,哇,看起来这种方法有效。当我的
br Solver<float>::Step(int iters)命令不起作用时,我在nm _caffe.so的结果中搜索Solver.*Step并发现只有一个这样的功能并尝试了b _ZN5caffe6SolverIfE4StepEi并且它有效!谢谢,下次我环顾C++时,我会尝试使用这种方法! (您可以将其作为答案重新发布,以便我将其选为选定答案)。 -
@ClaudioCorsi 有很多 C++ 类重载和继承函数,在
nm输出中似乎很难找到对应的函数名。
标签: python c++ templates gdb breakpoints