C 找出什么会打断睡眠
有没有办法找到中断对sleep()调用的信号的来源 我有大量的代码,我从gdb得到这个stacktrace: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
#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的评论交换做出这个假设的,但我澄清了我的答案。谢谢