C 找出什么会打断睡眠

C 找出什么会打断睡眠,c,gdb,signals,C,Gdb,Signals,有没有办法找到中断对sleep()调用的信号的来源 我有大量的代码,我从gdb得到这个stacktrace: #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/Cor

有没有办法找到中断对sleep()调用的信号的来源

我有大量的代码,我从gdb得到这个stacktrace:

#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

如果您连接到正在运行的进程,该进程将被GDB本身中断,以允许您进行调试。您观察到的堆栈跟踪只是您附加到它时正在运行的进程的堆栈<代码>睡眠()在附加到看似空闲的进程时,该进程不会处于不合理的系统调用状态

如果您正在调试在
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
生成的。在这些情况下,您的核心文件实际上可能没有指向任何错误,而只是指向创建核心文件时程序所处的状态。

您知道安装程序()中的睡眠地址吗?例如,sleep(&variable)。查找唤醒(&variable)的所有呼叫者,其中一个是睡眠断路器。如果有太多,那么我会添加一个跟踪数组来记住发出的唤醒,即只存储调用唤醒的PC…您可以在核心文件中读取

如果你确定睡眠是可中断的&&睡眠实际上被中断了,那么我会按照另一张海报所说的做……在信号处理器中捕捉信号,捕捉信号信息,并用相同的信号重新武装它

找出什么会干扰睡眠


当您将GDB连接到程序时,
sleep
实际上没有被任何东西中断——堆栈跟踪表明您的程序仍然在
sleep
系统调用中被阻塞。

我不知道您问题的答案,但是,您可以使用
sigprocmask()
屏蔽除
SIGKILL
之外的所有信号,您可能会有一些运气,但一般来说,我认为不可能找到信号的确切来源。您将正常返回的
sleep()
调用与中断区分开来了吗?如果堆栈跟踪来自核心文件,GDB应该告诉您加载核心文件时是什么信号导致核心文件生成。@jxh我没有区分sleep()被中断,我只是假设我得到指向sleep()的堆栈跟踪的唯一原因可能是因为呼叫被中断。问题中的
睡眠
功能与任何
唤醒
无关,也与任何条件无关。这是一个将执行暂停给定秒数的函数。OP没有说明任何关于
核心
文件的内容。@EmployedRussian:我是根据与OP的评论交换做出这个假设的,但我澄清了我的答案。谢谢