多实例上的 Gdb



我的系统上运行着特定进程的多个实例。在流程执行期间的某个时刻,某些内部数据结构会被无效数据覆盖。这发生在随机实例上,以随机间隔发生。除了设置内存访问断点之外,有没有办法调试它?此外,是否可以同时在所有这些进程上设置内存访问断点,而无需为每个进程启动单独的 gdb 实例?该过程在具有 2.6 内核x86_64 Linux 系统上运行。

如果你还没有这样做,建议使用valgrind(http://valgrind.org)。它可以检测多种类型的内存错误,包括内存运行过多/不足、内存泄漏、双重释放等。

此外,是否可以同时在所有这些进程上设置内存访问断点,而无需为每个进程启动单独的 gdb 实例?

我不认为使用 gdb 可以一次性为所有进程设置断点。据我说,您分别附加了每个进程并设置了断点。

对于内存错误,valgrind 比 GDB 有用得多。假设你正在谈论的实例是从单个父级分叉或生成的,你不需要单独的 valgrind 实例。只需使用valgrind --trace-children=yes

见 http://man7.org/linux/man-pages/man1/valgrind.1.html

至于你关于GDB的问题,一个实例一次只能调试一个进程。

每个 gdb 会话只能调试一个进程。如果您的程序分叉,如果没有提供其他要set follow-fork-mode的选项,gdb 将遵循父进程。

请参阅:http://www.delorie.com/gnu/docs/gdb/gdb_26.html

如果您有内存问题,甚至可以将 valgrind 与 gdb 结合使用或使用其他内存调试库,如 efence 。Efence用自己的函数替换了一些库调用,例如malloc/free。在那之后,valgrind 也使用 mmu 来捕获无效的内存访问。这通常是通过在每个分配的内存块之前和之后添加一些空间来完成的。如果应用程序访问此备用内存,则库(efence)或valgrind将停止执行。与 gdb 相关,您将被指向访问禁止内存区域的源代码行。

拥有多个进程需要多个 gdb 实例,这实际上没有真正的问题。

最新更新