【发布时间】:2015-12-26 19:51:38
【问题描述】:
int main () {
allocating_resource();
call_other_libs();
...
release_resource();
return 0;
}
程序运行后,main返回。
在它访问returne 0之后,堆栈指针指向main()中的错误地址,然后可执行文件崩溃了。
程序收到信号SIGSEGV,分段错误。
GI __libc_free(mem=0x3f21a843) at malloc.c:2020
我猜有一些非法的内存访问,但代码库太 大检查。查看和分析所有代码是不现实的。
由于代码库很大,禁用某些代码也是不可接受的。
对于核心转储,我无法使用任何提示,因为它在主堆栈处崩溃并且在执行 return 子句之后。
我知道如何使用gdb,但是项目太大了,似乎很难找到根本原因。
valgrind --tool=memcheck 似乎没有帮助。
如何解决这样的问题?
【问题讨论】:
-
你传递了一个无效的指针,我想。使用调试符号编译并使用调试器(例如 UNIX 上的 gdb)并中断对 free 的调用。
-
没有可能的魔法;如果代码很大,那么寻找错误是一项艰巨的任务。首先跟踪导致崩溃的释放,然后尝试从该位置回溯...
-
查看我的更新答案。还有一种称为 valgrind 的工具可以检测与内存相关的问题。这适用于您的问题与内存相关的情况。
-
答案再次更新。
-
MemProf 怎么样?我已经添加了答案。我知道这可能会对您有所帮助,因为它按功能提供功能,还可以检测已分配和未引用的内存。