用gdb调试C程序

时间:2012-11-22 21:16:19

标签: c gdb

我正在尝试测试我编写的调度程序。我安排了两个进程 - 两个进程都是无限循环(只是while(1)语句)。当我运行该程序有时它会在十秒之后(有时5秒,有时15或更多)发生段错误。有时它根本不会出现段错误并按预期运行。我有一个日志文件,告诉我在发生段错误之前,两个进程都按预期进行了调度。我正在尝试使用gdb调试错误,但它不是很有帮助。这是我用backtrace得到的:

#0  0x00007ffff7ff1000 in ?? ()
#1  0x000000000000002b in ?? ()
#2  0x00007ffff78b984a in new_do_write () from /lib64/libc.so.6
#3  0x000000000061e3d0 in ?? ()
#4  0x0000000000000000 in ?? ()

我真的不明白#2。

我认为这可能是堆栈溢出相关的错误。但是,我在整个过程中只有两次malloc - 两次当我设置两个进程时,我在我编写的pcb表中使用了一个pcb块。有没有人遇到过类似的问题?这可能与我如何设置/交换调度程序中的上下文有关吗?为什么有时会出现段错误,有时候不是?

2 个答案:

答案 0 :(得分:1)

您没有告诉 您是如何获得问题中显示的堆栈跟踪的。

很可能非常堆栈跟踪是伪造的,不是因为堆栈已损坏,而是因为您错误地调用了GDB,例如在附加进程或检查核心转储时指定了错误的可执行文件。

一个常见错误是使用-O2构建可执行文件(让我们调用此可执行文件E1),然后使用-g重建它(让我们调用此E2)并尝试分析正在运行core的实时流程E1,将GDB E2作为符号文件。

不要这样做,它不起作用,预计不起作用。

答案 1 :(得分:0)

由于您的堆栈似乎已损坏,您可能在某处有堆栈缓冲区溢出可能是正确的。没有代码,这有点难以辨别。

但这与您的malloc电话无关。溢出动态分配的缓冲区会破坏堆,而不是堆栈。

你可能需要注意的是局部变量对于你想要复制到他们的数据来说还不够大,例如:

char xyzzy[5];
strcpy (xyzzy, "this is a bad idea";

或者将缓冲区(再次,很可能是在堆栈上)传递给系统调用,该系统调用会向您写入比您提供的数据更多的数据。

它们是可能的最多原因,但理论上,当然,任何未定义的行为都可能导致此问题。如果基于此答案的解决方案不明显,您可能需要发布导致它的代码。尽量确保在执行此操作时尽可能减少它,以便它是显示错误的最短完整程序。

通常你会发现,问题变得明显: - )