5

我正在尝试在 android 的本机应用程序中调试段错误。GDB 显示以下内容:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 5200]
0xbfcc6744 in ?? ()
(gdb) bt
#0  0xbfcc6744 in ?? ()
#1  0x5cfb5458 in WWMath::unProject (x=2.1136094475592566, y=472.2994384765625, z=0, mvpMatrix=@0x0, 
    viewport=@0x0, result=@0x0) at jni/src/core/util/WWMath.cpp:118
#2  0x00000000 in ?? ()

是否有可能获得良好的堆栈?或者找到堆栈损坏的地方?

UPD:提到的功能参考:

bool WWMath::unProject(double x, double y, double z, const Matrix &mvpMatrix,
         const Rect& viewport, Vec4& result)

并且对简单局部变量的引用作为最后一个参数传递:

Vec4 far, near;
if (!unProject(x, y, 0, tMvp, viewport, near))
4

3 回答 3

5

我们没有太多信息可以参考!除了要小心寻址之外,没有避免内存损坏的一般规则。

但在我看来,你溢出了一个floats 数组,因为虚假地址0xbfcc6744 等于一个合理的float-1.597,该值与 GDB 报告的其他值一致。

覆盖返回地址会导致执行跳转到该值,因此请特别查看函数的调用者WWMath::unProject,其局部变量在其返回地址之前,以找到有问题的缓冲区。(现在我们有了它,near.)

于 2012-08-07T11:28:46.693 回答
2

编译--fstack-protector-all将导致您的程序在从损坏堆栈的函数返回时中止(使用信号 SIGABRT),如果该损坏包括返回地址周围的堆栈区域。

Stack-protector-all 不是一个很好的调试工具,但它很容易尝试,有时确实会遇到这样的问题。虽然它不会指出是哪一行导致了问题,但它至少会将其缩小到一个函数。一旦你有了这些信息,你就可以在 GDB 中单步执行它以查明有问题的行。

于 2012-08-07T11:51:49.227 回答
0

仅通过从可疑代码的开头逐行执行并查找堆栈损坏的那一刻来解决此问题。(这是二维数组的丑陋指针算法。)

而且似乎还有另一种方式:尝试把所有东西都放入堆中,希望不正确的操作会导致segfault。

于 2012-08-08T19:24:29.860 回答