【问题标题】:Gdb on multiple instance多个实例上的 Gdb
【发布时间】:2015-05-17 10:14:13
【问题描述】:

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

【问题讨论】:

    标签: linux debugging memory gdb watchpoint


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2018-09-16
            • 1970-01-01
            • 2014-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-15
            • 2020-06-15
            • 2011-05-25
            相关资源
            最近更新 更多