c++ - 如何检测进程是否正在调试

标签 c++ debugging gdb detect

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

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

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

最佳答案

有几种可能的解决方案:

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

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

  • 可能更好的方法是将 GDB 连接到 dummy1 Controller 。然后你可以在任何你想要的时候停止 Controller ,单步执行 dummy1,恢复其中一个或两个,等等。

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

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

关于c++ - 如何检测进程是否正在调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18542412/

相关文章:

c++ - C++向 vector 添加对象会破坏早期的对象

c++ - 错误 C2280;执行 employees.erase() 时出现 operator =(const Employee &) 问题

使用主机在虚拟机中运行的调试代码

c - "(gdb) run"在 qemu 模拟 arm 架构上运行可执行文件时崩溃

c - 在 gdb 中观察内存范围?

c++ - Debug exec 工作正常但正常的一个段错误

c++设计模式以避免复制和向下转换

c++ - 您应该在只有定义的文件中使用 extern "C"吗?

iphone - 如何调试或查看USB被占用的iOS设备的NSLog输出?

html - 是我的 HTML "leaking",因为它显示异常行为