我正在尝试测试我编写的调度程序。我安排了两个进程 - 都是无限 while 循环(只是 while(1) 语句)。当我运行该程序时,有时它会在 10 秒(有时 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 block 。以前有人遇到过类似的问题吗?这可能与我在调度程序中设置/交换上下文的方式有关吗?为什么有时会出现段错误,有时不会?
最佳答案
您没有告诉如何获得问题中显示的堆栈跟踪。
堆栈跟踪很可能是伪造的,不是因为堆栈已损坏,而是因为您错误地调用了 GDB,例如在附加进程或检查核心转储时指定了错误的可执行文件。
一个常见的错误是使用 -O2
构建可执行文件(我们将此可执行文件称为 E1
),然后使用 -g
重建它(让我们称之为E2
)并尝试分析正在运行E1
的实时进程的core
,将GDB E2
作为符号文件。
不要这样做,它不起作用,也不会起作用。
关于c - 使用 gdb 调试 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13520085/