如何检测进程是否正在被调试

n61*_*007 2 c++ debugging gdb detect

我有一个 C++ 应用程序,让我们调用dummy1,我想在 Linux(ubuntu 12.04)中的 cgdb(gdb 的 curl 接口)中调试它。调试需要与我有来源的控制器进程同步。

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

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

Emp*_*ian 5

有几种可能的解决方案:

  • 直接回答您的问题:您的控制器可以读取 /proc/PID/status(其中 PID 是dummy1进程的PID ),并查看TracerPid字段。如果非零,dummy1则正在调试,控制器应避免尝试控制。

请注意,这会回答“正在调试 dummy1”,而不是当前是否已停止 dummy1。为了允许控制器再次控制,您必须将 GDB 与 dummy1 分离。

  • 一个可能更好的方法是GDB连接到这两个dummy1控制器。然后你可以在任何你希望的时候停止控制器,单步执行 dummy1,恢复一个或两个,等等。

较新版本的 GDB 支持一次调试多个进程。但是,您可能会发现这很令人困惑。

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