【问题标题】:setting GDB breakpoint for C++ class member function written using template为使用模板编写的 C++ 类成员函数设置 GDB 断点
【发布时间】: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&lt;float&gt;::Step(int iters) 命令不起作用时,我在nm _caffe.so 的结果中搜索Solver.*Step 并发现只有一个这样的功能并尝试了b _ZN5caffe6SolverIfE4StepEi 并且它有效!谢谢,下次我环顾C++时,我会尝试使用这种方法! (您可以将其作为答案重新发布,以便我将其选为选定答案)。
  • @ClaudioCorsi 有很多 C++ 类重载和继承函数,在nm 输出中似乎很难找到对应的函数名。

标签: python c++ templates gdb breakpoints


【解决方案1】:

我从未尝试过,但您是否考虑过使用 nm 来确定它是如何在共享库中定义的?您或许可以使用该信息来帮助 ddd/gdb 始终如一地找到模板方法。

【讨论】:

    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多