0

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

4

4 回答 4

0

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

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

于 2015-03-15T11:50:10.837 回答
0

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

于 2015-03-15T08:52:44.887 回答
0

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

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

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

于 2015-05-14T16:27:58.363 回答
0

每个 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 实例,这实际上没有真正的问题。

于 2015-05-14T16:41:52.047 回答