我有下面的堆栈跟踪.能从中找出对调试有用的东西吗?

Program received signal SIGSEGV, Segmentation fault.
0x00000002 in ?? ()
(gdb) bt
#0  0x00000002 in ?? ()
#1  0x00000001 in ?? ()
#2  0xbffff284 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) 

当我们得到Segmentation fault,堆栈跟踪没有那么有用时,从哪里开始查看代码?

注:如果我发布代码,那么SO专家会给我答案.我想接受SO的指导,自己找到答案,所以我不在这里发布代码.道歉.

推荐答案

这些虚假地址(0x00000002等)实际上是PC值,而不是SP值.现在,当你用一个假的(非常小的)PC地址得到这种SEGV时,99%的时间是由于通过一个假的函数指针调用的.请注意,C++中的虚拟调用是通过函数指针实现的,因此虚拟调用的任何问题都可能以相同的方式表现出来.

间接调用指令只是在调用后将PC推到堆栈上,然后将PC设置为目标值(在本例中是假的),因此如果发生了这种情况,您可以通过手动将PC从堆栈中弹出来轻松撤销它.在32位x86代码中,您只需执行以下操作:

(gdb) set $pc = *(void **)$esp
(gdb) set $esp = $esp + 4

使用您需要的64位x86代码

(gdb) set $pc = *(void **)$rsp
(gdb) set $rsp = $rsp + 8

然后,您应该能够做bt,并找出代码的真正位置.

另外1%的时间,错误是由于覆盖堆栈造成的,通常是由于堆栈上存储的数组溢出.在这种情况下,您可以通过使用类似于valgrind的工具来更清楚地了解情况

C++相关问答推荐

生成C代码时自动复制/生成' tmwtypes.h '依赖项

了解一些CLIPS原语数据类型

Mbed TLS:OAEP的就地en—/decryption似乎不起作用'

以c格式打印时间戳

Malloc(sizeof(char[Length]))是否不正确?

如何将字符串传递给函数并返回在C中更改的相同字符串?

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

整型文字后缀在左移中的用途

Flose()在Docker容器中抛出段错误

C中的FREE函数正在触发断点

处理来自浏览器的HTTP请求

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

使用%f格式说明符打印整数值

为什么这个分配做得不好呢?

Linux/C:带有子进程的进程在添加waitid后都挂起

程序如何解释变量中的值

&stdbool.h&q;在嵌入式系统中的使用

';malloc():损坏的顶部大小';分配超过20万整数后

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?