【问题标题】:How to break at a constructor of base class using gdb?如何使用 gdb 打破基类的构造函数?
【发布时间】:2013-07-30 16:49:08
【问题描述】:

我的主cpp文件如下:

class UnifiedDirListQuery : public UnifiedQuery{
public:
    UnifiedDirListQuery(){
        //do something-------------line 12
    }
}
//other code

int main( void ){
    UnifiedQuery *query = new UnifiedDirListQuery();//-----line 56
    //do something
    delete query;
}

UnifiedQuery 分别在unified.hunified.cpp 中声明和定义。当我在 gdb 中调试这个程序时:

gdb: b 56
gdb: r
gdb: s

程序跳转到第 12 行。例如,如果在 unified.cpp : line 25 中定义了ctor,如何转到unified.cpp 并跳转到基类UnifiedQueryCtor

更新

对于break UnifiedDirListQuery::UnifiedDirListQuery 的答案,gdb 抱怨说:

(gdb) b UnifiedDirListQuery::UnifiedDirListQuery
[0] cancel
[1] all
?HERE
?HERE
> 1
Note: breakpoint -1 (disabled) also set at pc 0x0.
Breakpoint 1 at 0x0
Note: breakpoints -1 (disabled) and 1 also set at pc 0x0.
Breakpoint 2 at 0x0
warning: Multiple breakpoints were set.
Use the "delete" command to delete unwanted breakpoints.
(gdb) r
Starting program: /...(the path)/src/base/unified_album_list.cgi
Warning:
Cannot insert breakpoint 1.
Error accessing memory address 0x0: Input/output error.

对于b file:line的答案,gdb 直接无视,不停地跑过程序。顺便说一句:实际上 ctor 的定义在一个名为 unified.h 的文件中,隐式声明为内联函数,因为它在头文件中。

【问题讨论】:

    标签: c++ gdb breakpoints


    【解决方案1】:

    你也可以

    break UnifiedDirListQuery::UnifiedDirListQuery
    

    还要注意 gdb 具有制表符补全功能,因此您不必输入所有内容。

    【讨论】:

    • 该类是否存在于任何命名空间中?在 gdb 中,您需要完全符合条件。另外,您是否尝试过制表符完成(用于重载解决方案)?哦,如果构造函数是内联的,则可能根本无法中断。尝试调试版本。
    • 不行,我用'tab'完成,构造函数是内联的,也许这就是失败的一个很好的理由。 PS:什么是调试版本?
    • 调试构建意味着您禁用优化并启用调试符号,即使用 -O0 -g 编译(用于 gcc)
    • @arne 不是 -O0 默认值吗?
    • @Liam 取决于您的构建系统。许多 IDE 已经在默认项目模板中配置了某种优化。因此,如果您将 -O0 -g 添加到您的选项中,任何先前的 -O 标志都会被覆盖。
    【解决方案2】:

    break unified.cpp:25 应该可以解决问题,例如在第 25 行中断 特别是如果您有多个文件,则必须提供要中断的文件的名称。更多信息请见here

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 2021-03-14
      • 1970-01-01
      • 2011-12-26
      • 2016-07-19
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多