找出什么中断睡觉()

时间:2013-07-31 19:48:43

标签: c gdb signals

有没有办法找到中断睡眠呼叫()的信号来自哪里?

我有大量的代码,我从gdb获得了这个堆栈跟踪:

#0  0x00418422 in __kernel_vsyscall ()
#1  0x001adfc6 in nanosleep () from /lib/libc.so.6
#2  0x001adde1 in sleep () from /lib/libc.so.6
#3  0x080a3cbd in MRT::setUp (this=0x9c679d8) at /code/Core/exec/mrt.cc:50
#4  0x080a1efc in main (argc=13, argv=0xbfcb6934) at /code/Core/exec/rpn.cc:211

我不完全确定所有代码的作用,但我认为这是正在发生的事情:

Program 1 starts
Calls program 2 for shared memory allocation
Waits predetermined amount of time for allocation to complete
Program 1 continues

3 个答案:

答案 0 :(得分:1)

  

查找中断睡眠

当您将GDB附加到程序时,sleep实际上没有被任何内容中断 - 您的堆栈跟踪表明您的程序仍然sleep系统调用中被阻止。

答案 1 :(得分:0)

如果要附加到正在运行的进程,则GDB本身会中断该进程以允许您进行调试。您观察到的堆栈跟踪只是您附加到它时运行进程的堆栈。当您附加到似乎处于空闲状态的进程时,sleep()对于进程来说不是一个不合理的系统调用。

如果您正在调试显示sleep()中堆栈跟踪的核心文件,那么当您启动GDB加载核心文件时,它将显示核心文件当前堆栈帧的顶部。但就在上面,它显示了导致核心文件的信号。我编写了一个测试程序,这就是我将核心文件加载到GDB时所显示的内容:

Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000400458 in main ()
(gdb)

核心文件只是一个进程快照,并不总是由代码中的内部错误引起的。有时它是由外部程序或shell发出的信号生成的。有时它是通过从GDB中执行命令generate-core-file生成的。在这些情况下,您的核心文件可能实际上并未指出任何错误,而只是指向创建核心文件时程序所处的状态。

答案 2 :(得分:0)

你知道setup()里面的睡眠地址是什么吗?例如,睡眠(和变量)。寻找唤醒(和变量)的所有呼叫者,其中一个是睡眠破坏者。如果有太多,那么我会添加一个跟踪数组来记住发出的唤醒,即只是存储从唤醒被调用的PC ...你可以在核心文件中读取它。

如果您确定睡眠是可以中断的,并且&&睡眠实际上被打断了,然后我就会做另一张海报所说的......抓住信号处理器中的信号,捕获信号信息并用相同的信号重新武装它。