相关疑难解决方法(0)

如何从GDB中指向基类的指针确定某个对象是否是某个派生C++类的实例?

我正在用GDB调试一个C++程序.

我有一个指向某个类的对象的指针.指针被声明为某些超类,它由几个子类扩展.

对象中没有字段指定此对象的精确类类型,但是定义了一些虚函数(例如bool is_xxx())以在运行时告知类类型.

有没有办法在不调用这些虚函数的情况下告诉GDB中对象的精确类类型.当程序是多线程的时,在GDB中调用这些函数可能会产生令人困惑的结果.

c++ types gdb instanceof superclass

44
推荐指数
4
解决办法
2万
查看次数

如何在GDB中查看像数组一样的指针?

假设已定义:int a[100] 类型print a然后gdb将自动将其显示为数组:1, 2, 3, 4....但是,如果a作为参数传递给函数,那么gdb会将其视为普通的int指针,类型print a将显示:(int *)0x7fffffffdaa0.如果我想查看a数组,该怎么办?

c gdb

38
推荐指数
4
解决办法
3万
查看次数

使用gdb在C++的多态类中的vtable

如何使用指向具有虚函数的基类对象的指针来显示vtable?

c++ gdb vtable

10
推荐指数
2
解决办法
6735
查看次数

编译器的“-O0”选项和“-Og”选项有什么区别?

当我想要调试 C 或 C++ 程序时,我被教导如何使用-O0关闭优化,并将-ggdb符号插入到可执行文件中,这些符号针对使用gdb我使用的 GNU 调试器进行了优化(或者,您可以-glldb使用LLVM/clang 的lldb调试器,或者只是-g用于一般调试符号,但这不会像-ggdb表面上那么好......)。然而,我最近偶然发现有人说使用-Og(而不是-O0),这让我措手不及。果然,它在man gcc!:

-Og优化调试体验。 -Og启用不干扰调试的优化。它应该是标准编辑-编译-调试周期的优化级别选择,提供合理的优化级别,同时保持快速编译和良好的调试体验。

那么,有什么区别呢?这是-O0来自的描述man gcc

-O0减少编译时间并使调试产生预期结果。这是默认设置。

man gcc不过,明确表示-Og“应该是标准编辑-编译-调试周期选择的优化级别”。

这听起来像是-O0真正的“没有优化”,而-Og“进行了一些优化,但只是那些不干扰调试的优化”。它是否正确?那么,我应该使用哪个,为什么?

有关的:

  1. 相关,但不重复!(仔细阅读,它根本不重复):-O0 、-O1 和 -g 之间有什么区别
  2. 我对--copt=与 Bazel 一起使用的调试设置的回答:gdb:当前上下文中没有符号“i”

c c++ debugging gdb compiler-optimization

10
推荐指数
1
解决办法
5379
查看次数

GDB中的格式化打印

我想做printf风格打印GDB.例如,我想打印一个变量值,但用一些文字来描述它是什么.可以这样做,如果是的话,你能举个例子吗?

c gdb

5
推荐指数
2
解决办法
5475
查看次数

从核心转储中识别auto_ptr背后的具体对象类型

我有一个auto_ptr<IFoo>,IFoo只有纯虚方法的接口.

我现在在分段错误之后也有一个核心文件,我真的想知道这个auto_ptr背后的具体子类是什么.作为dynamic_cast项目中的工作,我认为RTTI必须以某种方式提供,但我不知道如何通过这些信息访问gdb

我得到的输出如下:

(gdb) print this->obj._M_ptr
$22 = (class martin::IFoo *) 0x7418
Run Code Online (Sandbox Code Playgroud)

我真的很想知道,如果指针属于一个IBar或一个IBaz.

谢谢你的帮助!

c++ gdb postmortem-debugging

5
推荐指数
1
解决办法
1229
查看次数