如何检测进程是否正在调试 我有一个C++应用程序,让我们调用Dimy1,我想在CGDB中调试,这是一个GDB的CURL接口,在Linux(Ubuntu 12.04)中。 调试需要与控制器进程同步,我有它的源代码

如何检测进程是否正在调试 我有一个C++应用程序,让我们调用Dimy1,我想在CGDB中调试,这是一个GDB的CURL接口,在Linux(Ubuntu 12.04)中。 调试需要与控制器进程同步,我有它的源代码,c++,debugging,gdb,detect,C++,Debugging,Gdb,Detect,编辑控制器通过http与dummy1进行连接、通信和控制。我想在某个函数和步骤中打破dummy1。发生这种情况时,我希望得到控制器的通知。然后控制器应该改变它的状态,直到它收到我继续dummy1的通知。同时,它不应试图控制dummy1,或发起与dummy1的通信 我的问题是如何在/通知控制器中检测/如果我的dummy1进程当前正在调试(处于中断状态)?有几种可能的解决方案: 直接回答您的问题:您的控制器可以读取/proc/PID/status(其中PID是dummy1进程的PID),并查看Tr

编辑控制器通过http与dummy1进行连接、通信和控制。我想在某个函数和步骤中打破dummy1。发生这种情况时,我希望得到控制器的通知。然后控制器应该改变它的状态,直到它收到我继续dummy1的通知。同时,它不应试图控制dummy1,或发起与dummy1的通信


我的问题是如何在/通知控制器中检测/如果我的dummy1进程当前正在调试(处于中断状态)?

有几种可能的解决方案:

  • 直接回答您的问题:您的控制器可以读取/proc/PID/status(其中PID是
    dummy1
    进程的PID),并查看
    TracerPid
    字段。如果非零,
    dummy1
    正在调试,控制器应避免尝试控制
请注意,这回答的是“正在调试dummy1”,而不是dummy1当前是否已停止。为了允许控制器再次控制,您必须从dummy1分离GDB

  • 一种可能更好的方法是将GDB同时连接到dummy1和控制器。然后,您可以在您希望的任何时候停止控制器,单步执行dummy1,恢复其中一个或两个,等等
较新版本的GDB支持一次调试多个进程。然而,您可能会发现这相当令人困惑

  • 另一种选择是只运行两个GDB实例——一个用于控制控制器,另一个用于控制dummy1

您已经考虑过了,只需添加一个命令行标志,并在调试器中启动应用程序时将其传递给应用程序。@naxa如果这是在x86上,您可以尝试挂接INT1和INT3。这是一些软件用来防止调试的一种技术。我曾经处理过一个类似的问题,让我的虚拟进程fork执行一个gdb实例,将pid作为命令行的一部分发送。事实上,我实际上是使用带有外部ip的
xterm
前端进行显示的,因此我可以远程调试它。类似的事情(也许不是那么疯狂,但也许是第一部分)可能对你有用。