【问题标题】: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 将无法告诉您内存滥用发生在源代码的哪个位置。