2012-11-22 91 views
0

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

#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块。有没有人遇到过类似的问题?这可能与我如何设置/交换调度程序中的上下文有关吗?为什么有时会出现段错误,有时不会呢?

+0

你应该使用调试信息编译你的代码(在gcc中使用-g),那么你的堆栈跟踪会更有意义 – onon15

+0

看到这个明显被捣毁的堆栈,我怀疑'-Wall'也会有帮助。 – alk

+0

而不是描述你的代码,你应该在这里发布它。评论具体代码比散文更容易。 –

回答

0

由于你的堆栈似乎损坏,你可能是正确的,你有一个堆栈缓冲区溢出的地方。没有代码,这有点难以分辨。

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

Whay你可能需要看的是局部变量是不是你想在拷贝到他们,像数据足够大:

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

或传递缓冲(再次,最有可能在堆栈上)进行系统调用,该系统调用会向您提供的数据写入更多的数据。

他们是最有可能原因虽然从理论上说,当然,任何你的一部分未定义行为可能导致此。如果解决方案根据此答案不明显,则可能需要发布导致该问题的代码。尽量确保你尽可能地修剪它,以便它是展示错误的最短的完整程序。

你会经常通过这样做,发现,问题就变得:-)

+0

嘿我注释了一些代码(设置第二个过程)。在上面。你能帮我弄清楚什么是错的吗?谢谢 – user1710707

+1

@ user1710707,不是一个代码可以使用:-)但是,在我的答案中,这可能是后面的问题,将无效的参数传递给一个调用。类似于Exec的调用通常期望在argv数组末尾添加一个额外的元素,将其设置为null。不确定p_spawn_internal是否属于这种情况,但您应该考虑一下。 – paxdiablo

1

显然你没有告诉你如何获得你的问题显示堆栈跟踪。

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

一个常见的错误是-O2(我们称之为可执行E1),然后用-g(我们称之为E2)重建它来生成可执行文件并尝试分析运行E1给GDB E2作为活动进程core符号文件。

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