【问题标题】:Debugging with multiple linked files in GDB在 GDB 中使用多个链接文件进行调试
【发布时间】:2016-05-16 15:31:35
【问题描述】:

我现在正在调试一个程序,它有几个文件:arr.h 是一个列表类的头文件,它创建了一个链表数组(随机生成)。 Howard.cpp 是实现文件,而 main.cpp 是我放置调用列表类对象上的函数的主要函数的位置。它包括list.h。我的一个函数(在 Howard.cpp 中实现)出现段错误。我进入了GDB。当 seg 故障发生时,我知道输入“where”或“list”来获取导致 seg 故障的函数调用。在这种情况下,当我到达发生 seg 错误的函数(第 0 帧)时,我想查看变量以及它们在该函数中的值。但是,当我尝试进入该特定功能或键入“info locals”时,我会收到“没有可用的符号表信息”的消息。我知道这不是真的,但我不知道如何才能看到它失败的那条线。此外,不会显示有关该函数/文件的任何行信息。我认为这与不是可执行文件的函数中的错误有关;但我能做些什么呢?如果这个问题完全令人困惑,请随时要求我澄清。我对这一切都很陌生。

这是一个 linux 终端环境,由我班的教授创建,用于练习链表和递归。

好的,我将在此处包含一个示例:

我有一个函数可以递归地反向复制一个链表数组。递归函数称为 table::reverse_table(node *&,node *,node *)。我已经将它调试到我知道停止点没有问题的地步。当程序段错误时,我会输入“where”,它会输出:

#0  0x0000000000400e6e in table::reverse_table(node*&, node*, node*) ()
#1  0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#2  0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#3  0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#4  0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#5  0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#6  0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#7  0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#8  0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#9  0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#10 0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#11 0x0000000000400df1 in table::reverse_table(node*&, node*, node*) ()
#12 0x0000000000400f87 in table::reverse_table(table&, int, int) ()
#13 0x0000000000400fe7 in table::reverse_table(table&) ()
#14 0x0000000000401087 in main ()

然后,当我输入“frame 0”时,它会显示:

#0  0x0000000000400e6e in table::reverse_table(node*&, node*, node*) ()

当我输入“info locals”时,会显示“没有可用的符号表信息”。我也无法获得有关段错误发生在函数中的位置的任何信息; GDB 似乎没有这些信息。在调试时我需要做些什么来包含它吗?

【问题讨论】:

  • 您可以添加一个 SSCCE (sscce.org) - 这样会更清楚。
  • 添加了我在调试时看到的 gdb 消息。希望这是足够的信息。我真的不想发布我的代码,因为我不希望它看起来我只是想解决我的问题。我正在尝试弄清楚如何自己调试我的问题。

标签: c++ gdb


【解决方案1】:

我希望在编译期间启用调试标志(-g)。 您收到此消息是因为进程已终止并且没有可用的符号表信息。您应该尝试通过 gdb 运行您的程序,并且何时会发生 seg 错误;使用 bt (backtrace) 命令检查导致分段错误的最后一个函数。通过在该函数入口点上使用断点再次运行您的程序。使用 next 命令或 info 命令检查 locals 的值。

【讨论】:

  • 我一直在这样做;即使程序没有终止,它也不会显示除 main 之外的任何函数的任何符号表信息,它只是调用我需要调试的函数。
  • 好的,这很尴尬,但是在我编译时添加 -g 完全修复了它。我还以为是教授收录的呢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 2017-06-27
  • 2020-03-11
相关资源
最近更新 更多