【发布时间】: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 消息。希望这是足够的信息。我真的不想发布我的代码,因为我不希望它看起来我只是想解决我的问题。我正在尝试弄清楚如何自己调试我的问题。