0

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

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

4

2 回答 2

1

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

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

-O2一个常见的错误是用(我们称之为可执行文件)构建可执行文件,然后用(我们称之为这个)E1重建它,并尝试分析正在运行的实时进程,将GDB作为符号文件。-gE2coreE1E2

不要那样做,它不起作用,也不应该起作用。

于 2012-11-23T02:03:02.837 回答
0

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

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

您可能需要查看的是对于您尝试复制到其中的数据来说不够大的局部变量,例如:

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

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

它们是最可能的原因,当然,理论上,您的任何未定义行为都可能导致这种情况。如果基于此答案的解决方案不明显,您可能需要发布导致它的代码。当你这样做时,尽量确保你尽可能地减少它,以便它是最短的完整程序,显示错误。

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

于 2012-11-22T21:34:57.777 回答