Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GDB核心转储具有损坏的堆栈,显示;位于的堆栈帧无法访问地址0x12处的内存;_Gdb_Core - Fatal编程技术网

GDB核心转储具有损坏的堆栈,显示;位于的堆栈帧无法访问地址0x12处的内存;

GDB核心转储具有损坏的堆栈,显示;位于的堆栈帧无法访问地址0x12处的内存;,gdb,core,Gdb,Core,我的应用程序中有一个内核转储,当我试图分析它时,它似乎有一个corrup堆栈。谁能帮我找到问题的根源吗 Program terminated with signal 11, Segmentation fault. #0 0x40173f54 in nanosleep () from /lib/libc.so.6 (gdb) bt #0 0x40173f54 in nanosleep () from /lib/libc.so.6 #1 0x401b2a1c in __libc_enable_

我的应用程序中有一个内核转储,当我试图分析它时,它似乎有一个corrup堆栈。谁能帮我找到问题的根源吗

Program terminated with signal 11, Segmentation fault.
#0  0x40173f54 in nanosleep () from /lib/libc.so.6
(gdb) bt
#0  0x40173f54 in nanosleep () from /lib/libc.so.6
#1  0x401b2a1c in __libc_enable_asynccancel () from /lib/libc.so.6
#2  0x0000cdb8 in ?? ()
Cannot access memory at address 0x12



(gdb) info frame
Stack level 0, frame at 0xbeaedbc0:
 pc = 0x40173f54 in nanosleep; saved pc 0x401b2a1c
 called by frame at 0xbeaedbd8
 Arglist at 0xbeaedbc0, args:
 Locals at 0xbeaedbc0, Previous frame's sp is 0xbeaedbc0
(gdb) info frame 1
Stack frame at 0xbeaedbd8:
 pc = 0x401b2a1c in __libc_enable_asynccancel; saved pc 0xcdb8
 called by frame at Cannot access memory at address 0x12
(gdb) info frame 2
Stack frame at Cannot access memory at address 0x12

此堆栈可能已损坏,也可能未损坏,在使用
-fomit帧指针时也会发生这种情况

值得一提的是,这是我目前的策略。我并不认为这是一个最佳策略,只是目前对我有效的策略:

  • 获取符号。关于代码的信息越多,您自己重新创建该信息的痛苦就越小

  • 我手动重新构造堆栈。为此,我通常开始将堆栈中的指针对齐值输入到“info symbol”,以查看是否可以获得任何有用的信息。由于缺少符号,对内存位置上的“指令”进行解码也很有用,这些指令可能由值指向,如果作为指针,这些值将接近已知代码位置。这会产生对具有符号的位置的调用

  • 当我的堆栈向下扩展时(这里就是这种情况),我发现查看哪些函数候选者调用了最后一个看起来有效的函数会很有用

  • 我试图重现这个问题。如果我能让事情失败,那么一切都会简单很多

  • 然后我查看堆栈并尝试确定损坏开始的偏移量

  • 我遍历函数候选者的程序集,以获得关于在哪些偏移处存在哪些数据结构的提示

  • 最后,有可能是某个线程随机命中了一段内存(例如,另一个线程冲出了自己的堆栈,错过了可能的保护页并命中了您的堆栈。)如果您还没有任何线索,现在是时候扫描内存,寻找指向堆栈损坏部分的指针,然后对找到的数据结构进行反向工程


  • 此堆栈可能已损坏,也可能未损坏,在使用
    -fomit帧指针时也会发生这种情况

    值得一提的是,这是我目前的策略。我并不认为这是一个最佳策略,只是目前对我有效的策略:

  • 获取符号。关于代码的信息越多,您自己重新创建该信息的痛苦就越小

  • 我手动重新构造堆栈。为此,我通常开始将堆栈中的指针对齐值输入到“info symbol”,以查看是否可以获得任何有用的信息。由于缺少符号,对内存位置上的“指令”进行解码也很有用,这些指令可能由值指向,如果作为指针,这些值将接近已知代码位置。这会产生对具有符号的位置的调用

  • 当我的堆栈向下扩展时(这里就是这种情况),我发现查看哪些函数候选者调用了最后一个看起来有效的函数会很有用

  • 我试图重现这个问题。如果我能让事情失败,那么一切都会简单很多

  • 然后我查看堆栈并尝试确定损坏开始的偏移量

  • 我遍历函数候选者的程序集,以获得关于在哪些偏移处存在哪些数据结构的提示

  • 最后,有可能是某个线程随机命中了一段内存(例如,另一个线程冲出了自己的堆栈,错过了可能的保护页并命中了您的堆栈。)如果您还没有任何线索,现在是时候扫描内存,寻找指向堆栈损坏部分的指针,然后对找到的数据结构进行反向工程