有没有办法找到中断睡眠呼叫()的信号来自哪里?
我有大量的代码,我从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
答案 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 ...你可以在核心文件中读取它。
如果您确定睡眠是可以中断的,并且&&睡眠实际上被打断了,然后我就会做另一张海报所说的......抓住信号处理器中的信号,捕获信号信息并用相同的信号重新武装它。