我的系统上运行了一个特定进程的多个实例。在流程执行期间的某个时刻,一些内部数据结构被无效数据覆盖。这发生在随机时间间隔的随机实例上。除了设置内存访问断点之外,还有其他方法可以调试吗?此外,是否可以同时在所有这些进程上设置内存访问断点,而无需为每个进程启动单独的 gdb 实例?该进程在具有 2.6 内核的 x86_64 linux 系统上运行。
4 回答
此外,是否可以同时在所有这些进程上设置内存访问断点,而无需为每个进程启动单独的 gdb 实例?
我不认为使用 gdb 可以一次性为所有进程设置断点。据我说,你已经分别附加了每个进程并设置了断点。
如果您还没有这样做,建议您使用 valgrind ( http://valgrind.org )。它可以检测多种类型的内存错误,包括内存溢出/不足运行、内存泄漏、双重释放等。
对于内存错误,valgrind 比 GDB 有用得多。假设您正在谈论的实例是从单亲派生或派生的,您不需要单独的 valgrind 实例。只需使用 valgrind --trace-children=yes
见http://man7.org/linux/man-pages/man1/valgrind.1.html
至于您对 GDB 的问题,一个实例一次只能调试一个进程。
每个 gdb 会话只能调试一个进程。如果你的程序分叉,如果没有给出其他选项,gdb 会跟随父进程set follow-fork-mode
。
见: http: //www.delorie.com/gnu/docs/gdb/gdb_26.html
如果您有内存问题,甚至可以将 valgrind 与 gdb 结合使用,或者使用其他一些内存调试库,例如efence
. Efence 用自己的函数替换了一些库调用,例如 malloc/free。在那之后,valgrind 也使用 mmu 来捕获无效的内存访问。这通常通过在每个分配的内存块之前和之后添加一些空间来完成。如果您的应用程序访问了此备用内存,则库( efence )或 valgrind 将停止执行。与 gdb 相关,您将被指向访问禁止内存区域的源代码行。
拥有多个进程需要多个 gdb 实例,这实际上没有真正的问题。