HI,我最近在用C编写的linux项目中。 这个应用程序有几个进程,它们共享一块共享内存...当应用程序运行大约几个小时时,一个进程崩溃而没有任何足迹,因此知道问题是什么或我可以开始查看代码的位置非常困难.... 好吧,它可能是内存溢出或指针瘫痪...但我完全不知道...... 你有任何工具或任何方法来检测问题...... 如果它得到解决,我们将非常感激。 thanx的建议......
答案 0 :(得分:4)
在启动程序之前,启用核心转储:
ulimit -c unlimited
(并确保进程的工作目录可由进程写入)
在进程崩溃后,它应该留下core
文件,然后您可以使用gdb
进行检查:
gdb /some/bin/executable core
或者,您可以在启动时在gdb
下运行该过程 - gdb
会在进程崩溃时唤醒。
答案 1 :(得分:3)
如果您正在运行emacs,也可以在gdb-many-windows中运行gdb。它为您提供了更好的调试选项,可以让您检查堆栈等内容。这非常类似于Visual Studio IDE。
这是一个有用的链接
http://emacs-fu.blogspot.com/2009/02/fancy-debugging-with-gdb.html
答案 2 :(得分:1)
Valgrind是您下一步需要去的地方。有可能是你有一个记忆滥用的问题是良性的 - 直到它没有。在valgrind下运行程序并查看它的内容。
答案 3 :(得分:0)
我同意bmargulies - Valgrind绝对是自动检测错误内存使用情况的最佳工具。几乎所有Linux发行版都应该拥有它,所以只需emerge valgrind
或apt-get install valgrind
或发行版使用的任何内容。
然而,Valgrind现在并不是最不神秘的东西,它通常只能帮助你告诉程序最终错误地访问内存的位置 - 如果你在一个变量中存储了一个不正确的数组索引然后稍后访问它,那么你仍然需要弄明白。特别是当与强大的调试器(如GDB)配对时(backtrace
或bt
命令是你的朋友),Valgrind是一个非常有用的工具。
请记住使用-g
标志进行编译(如果您正在使用GCC,至少),或者Valgrind和GDB将无法告诉您内存中滥用内存的位置。