Handling signals with gdb

杀马特。学长 韩版系。学妹 提交于 2019-12-10 15:20:57

问题


I'm debugging a C++ app for Ubuntu 10.04 that sometimes receives a SIGKILL signal. I want to catch the signal and stop it from killing the execution, just to see if I can get some useful info of the app's state at that precise moment.

Reading the gdb documentation I found the handle command, so I tried to apply it to the SIGKILL signal:

(gdb) handle SIGKILL stop nopass
Signal        Stop  Print   Pass to program Description
SIGKILL       Yes   Yes     No              Killed

So, as I understand this correctly:

stop
    GDB should stop your program when this signal happens. This implies the print keyword as well. 
print
    GDB should print a message when this signal happens. 
nopass
    GDB should not allow your program to see this signal. 

once the SIGKILL signal is emitted, gdb should somehow catch it, print the message, stop the execution and don't let the app kill itself, right?

The problem is that this doesn't happen and the app terminates.

Do you know how could I catch the signal?

Useful Info:

  • The piece of code that is running when the signal is emitted is executed in another thread.
  • gdb version: 4.4.3
  • g++ version: 7.1

回答1:


From unix signal(7) man page:

  The  signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

So the debugger can set the handler but that doesn't make any sense. The OS directly performs the needed action. If SIGKILL could be handled from application the OS has no chance to terminate a broken application. For that reason SIGKILL is a bit special :-)



来源:https://stackoverflow.com/questions/23826676/handling-signals-with-gdb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!