c - 使用 gdb 调试 C 程序

标签 c gdb

我正在尝试测试我编写的调度程序。我安排了两个进程 - 都是无限 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/

相关文章:

c - 一些 fgets 不能在 C 编程中工作

c - 循环中的阻塞函数

objective-c - 哪种类型的数组用于大量数字?

c - 在 gdb 中打印函数宏定义

c - 程序集/C/GDB : code to hexadecimal

gdb - 陷入 Stallman 的 GDB 书中尝试调试 m4(宏处理器) 'bug' 示例 : m4 executable i have is a direct bin in/bin (nothing ".../gnu/./m4")

c - 为什么不处理 SIGUSR1 信号?

c - 数组的高效索引

gdb - 使用 gdb 向后反汇编核心文件

c - 使用 valgrind 和 gdb 跟踪变量更改