2010-01-28 24 views
4

嗨,我最近在用C编写的linux项目中。 这个应用程序有几个进程,它们共享一个共享内存块...当应用程序运行几次小时,一个进程崩溃没有任何足迹,因此很难不知道问题是什么或在哪里我可以开始审查代码....好吧,它可能是内存溢出或指针marused ...但我不知道。 .. 你有任何工具或任何方法来检测问题... 它将非常感激,如果它得到解决。 thanx为您的建议...如何检测我的应用程序在Linux中崩溃的位置

回答

4

之前启动该程序,使核心转储:

ulimit -c unlimited 

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

的进程崩溃后,就应该留下一个core文件,然后你可以gdb检查:

gdb /some/bin/executable core 

此外,还可以根据运行过程当你启动它时 - gdb会在进程崩溃时唤醒。

1

Valgrind是你需要下一步去的地方。机会是你有一个良性的记忆错误问题 - 直到它不是。运行valgrind下的程序,看看它说什么。

3

如果您正在运行emacs,您也可以在gdb-many-windows中运行gdb。这给你更好的调试选项,可以让你检查堆栈等东西。这很像Visual Studio IDE。

这里是一个有用的链接

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

我同意bmargulies - Valgrind是绝对目前最好的工具来自动检测不正确的内存使用情况。几乎所有的Linux发行版都应该拥有它,所以只需emerge valgrindapt-get install valgrind或任何发行版使用。然而,Valgrind并不是存在的最神秘的东西,它通常只能帮助你判断程序最终是以什么方式错误地访问内存 - 如果你在一个变量中存储了一个不正确的数组索引,然后在之后访问这个数组,那么你仍然必须弄清楚。特别是在与GDB这​​样强大的调试器配对时(然而,backtracebt命令是你的朋友),Valgrind是一个非常有用的工具。

只要记住用-g标志进行编译(如果您至少使用GCC),或者Valgrind和GDB将无法告诉您在源中发生内存滥用的位置。