【问题标题】:How to detect where my app collapsed in linux如何检测我的应用程序在 linux 中崩溃的位置
【发布时间】:2010-01-28 02:44:39
【问题描述】:

嗨,我最近在一个用 C 编写的 linux 项目中。 这个应用程序有几个进程,它们共享一块共享内存......当应用程序运行大约几个小时时,一个进程崩溃而没有任何足迹,所以很难知道问题出在哪里或者我可以从哪里开始查看代码…… 好吧,它可能是内存溢出或指针误用...但我不知道确切... 您是否有任何工具或任何方法来检测问题... 如果得到解决,将不胜感激。谢谢你的建议...

【问题讨论】:

    标签: c linux debugging memory-leaks


    【解决方案1】:

    在启动程序之前,启用核心转储:

    ulimit -c unlimited
    

    (并确保进程的工作目录是进程可写的)

    进程崩溃后,它应该留下一个core 文件,然后您可以使用gdb 进行检查:

    gdb /some/bin/executable core
    

    或者,您可以在启动时运行gdb 下的进程 - gdb 将在进程崩溃时唤醒。

    【讨论】:

      【解决方案2】:

      如果你正在运行 emacs,你也可以在 gdb-many-windows 中运行 gdb。它为您提供了更好的调试选项,让您可以检查堆栈等内容。这很像 Visual Studio IDE。

      这是一个有用的链接

      http://emacs-fu.blogspot.com/2009/02/fancy-debugging-with-gdb.html
      

      【讨论】:

        【解决方案3】:

        Valgrind 是您接下来需要去的地方。很有可能你有一个良性的内存滥用问题——直到它不是。在 valgrind 下运行程序,看看它说了什么。

        【讨论】:

          【解决方案4】:

          我同意 bmargulies 的观点——Valgrind 绝对是自动检测错误内存使用的最佳工具。几乎所有 Linux 发行版都应该有它,所以只需 emerge valgrind 或 apt-get install valgrind 或任何你的发行版使用的。

          然而,Valgrind 几乎不是现存的最不神秘的东西,它通常只能帮助你判断程序最终在哪里错误地访问了内存——如果你在变量中存储了一个不正确的数组索引,然后再访问它,那么你仍然必须弄清楚这一点。然而,尤其是与 GDB 等功能强大的调试器配合使用时(backtrace 或 bt 命令是您的朋友),Valgrind 是一个非常有用的工具。

          请记住使用-g 标志进行编译(至少如果您使用的是 GCC),否则 Valgrind 和 GDB 将无法告诉您内存滥用发生在源代码的哪个位置。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-06
            • 2015-12-17
            • 1970-01-01
            • 1970-01-01
            • 2015-09-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多