需要有关Seg故障调试的建议

时间:2011-02-12 03:11:44

标签: segmentation-fault

我正在研究在Linux中运行的旧c ++程序。这是我曾经尝试过的最糟糕的代码,使用ValGrind运行它会带来大量的内存问题。

我想逐个发现seg故障,但是当ValGrind找到该行时,代码崩溃就已经完成了损坏。此代码使用第三方库以及本地库。第三方图书馆可以信任,但不是本土的。

有没有人对如何找到导致seg故障的内存损坏有任何建议?我从来没有在其他人的代码中找到seg错误,特别是在没有文档的情况下发布的代码。

我今天发现的两件事是,编译器设置被更改为NOT自动初始化。值和字大小从32位更改为64位。

我的目标在于试图取得任何进展,任何人都有任何深刻的记忆分析想法?

感谢

5 个答案:

答案 0 :(得分:0)

Gdb可能是比valgrind更好的选择;当您的应用程序(在gdb下运行)收到SIGSEGV时,gdb将暂停执行并生成堆栈跟踪,列出已调用到该点的函数,并将保留程序内存的状态供您阅读。您需要使用调试信息(gg中的-g)构建应用程序才能使其正常工作。即使无法重建库,保存程序的内存也可能是一个很大的帮助。

答案 1 :(得分:0)

GDB是一个很好的建议。您还可以使用ulimit unlimitedman page)让系统在程序崩溃时转储核心文件。

也就是说,这些工具提供的信息在处理内存错误时可能会产生误导。内存损坏可能导致程序在与问题根源无关的随机位置崩溃。如果您发现自己正在查看核心转储或GDB输出,并想知道该程序可能如何进入该状态,那很可能就是这种情况。

在这种情况下,valgrind是你最好的朋友。从它的内存错误列表的顶部开始,一次修复一个(我的意思是修复一个,然后重新运行,然后修复下一个,依此类推;这是因为修复一个错误经常会消除许多其他错误直到他们都走了。然后您的程序将更稳定,或者您的工具将再次为您提供有用的信息。

答案 2 :(得分:0)

调试内存损坏的最简单方法是在发生损坏后尽早发现损坏,最好是在确切的时间 - 这样可以让您查看哪个线程和方法有问题。

一般来说,腐败是难以捉摸的,因为失败只发生在损害后的某个时间。 Valgrind和其他工具旨在通过采用一些检查来确保缓冲区溢出和其他叠加层被捕获,从而帮助更早地捕获损坏。

尝试查看用户指南,或尝试使用其他工具查看是否可以强制崩溃或断点接近损坏。

也就是说,在自然崩溃点使用调试器可以揭示有关损坏内存的信息,但有时它可能是一个艰难的过程。像valgrind这样的工具如果它们不会导致问题消失或导致性能低得令人无法接受,那么这些工具是非常宝贵的。

答案 3 :(得分:0)

查看是否可以在内存分配器中启用调试功能。 glibc的malloc实现确实有一些健全性检查,可以某种方式启用。

我曾经遇到过一个案例(在一个带有简单的基于链的malloc的嵌入式系统上),其中应用程序覆盖了所使用的内存分配器的内部数据结构 - 导致内存分配的偶发段错误。

答案 4 :(得分:0)

谢谢大家,不知道是谁给予赞誉,但是valGrind发现了我的问题,似乎代码是在需要它们的保存操作之前删除对象。我花了一点时间才得到了valgrind的输出,但它错了。