gdb类是不完整的类型,直到我在类构造函数中设置断点?

时间:2016-12-09 20:42:25

标签: c++ debugging

我在gdb中调试Chrome并且我一直遇到这个问题:

如果我尝试打印某种类型的变量,GDB不知道它的内部结构:

(gdb) p current_child_.get()
$12 = (blink::NGBlockNode *) 0xc2f755c1830
(gdb) p *(current_child_.get())
$13 = <incomplete type>

但是,如果我只是在该类的构造函数中设置断点,gdb会突然发现该类型的符号:

(gdb) br blink::NGBlockNode::NGBlockNode
Breakpoint 3 at 0x51db40 (4 locations)
(gdb) p *(current_child_.get())
$14 = {
  <blink::NGLayoutInputNode> = {
    <blink::GarbageCollectedFinalized<blink::NGLayoutInputNode>> = {
      <blink::GarbageCollected<blink::NGLayoutInputNode>> = {<No data fields>}, <No data fields>},

这太烦人了,我有一组宏来设置我经常打印的类中的断点。还有其他解决方法吗?

2 个答案:

答案 0 :(得分:0)

事实证明,根本原因是我的编译标志:一起使用gcc --gdb-index和--split-dwarf选项会导致调试信息损坏。 – Aleksandar Totic

答案 1 :(得分:0)

我知道一种解决方法。如果知道定义该类型的文件,则可以通过“ print'file.cc” :: some_variable”强制加载该类型的调试信息。这个“ some_variable”是否存在并不重要。

例如

(gdb) p render_thread
$2 = (content::RenderThreadImpl *) 0x1261201f7920
(gdb) p *render_thread
$3 = <incomplete type>
(gdb) ptype render_thread
type = class content::RenderThreadImpl {
    <incomplete type>
} *
(gdb) p 'render_thread_impl.cc'::nonexist_variable
No symbol "nonexist_variable" in specified context.
(gdb) ptype render_thread
type = /* real type = content::RenderThreadImpl * */
class content::RenderThreadImpl : <snipped> {
  <snipped>
} *
(gdb) p *render_thread
$4 = (content::RenderThreadImpl) { <snipped> }
(gdb)