GDB分析Core文件:McSystem函数触发SIGSEGV崩溃原因排查求助
排查思路:SIGSEGV在
push %eax指令处 当前崩溃发生在McSystem::RWCString2RWTime函数的push %eax指令(地址0x08d0290f),%eax的值为1684480973(十六进制0x64D610CD),该值并非合法栈地址,以下是具体排查方向:
检查栈帧完整性
- 打印当前ebp寄存器值:
print $ebp,确认是否为合法栈地址。若ebp值异常,说明上层函数调用时栈帧已被破坏。 - 执行栈回溯:
bt,查看调用链中是否存在栈溢出、非法内存写入等破坏栈帧的行为。
- 打印当前ebp寄存器值:
验证目标地址是否属于栈空间
- 查看进程内存映射:
info proc mappings,找到栈(stack)对应的内存区间,对比%eax的值是否在该区间内。若不在,说明lea -0x10(%ebp),%eax计算出的地址无效,根源是ebp被篡改。
- 查看进程内存映射:
检查当前函数的参数有效性
- 打印函数输入参数:
print from、print to,确认这两个引用指向的对象是否合法(比如是否为野指针、已释放的内存)。若to引用的STSTime对象已被销毁,可能间接导致栈异常。
- 打印函数输入参数:
分析
STSTime构造函数的调用上下文- 查看
McSystem.cpp第1613行源码,确认调用STSTime构造函数时是否使用了默认参数(比如STSZone或STSLocale的默认实例)。若默认参数初始化存在问题(比如全局对象未正确构造),可能引发栈地址计算错误。 - 打印栈上临时变量:
x/4x $ebp-0x10,查看该地址内容是否合法,是否属于预期的参数对象。
- 查看
排查栈溢出可能性
- 检查上层函数的局部变量大小,若上层函数分配了大量栈内存,可能导致栈空间耗尽,后续push操作触发段错误。可通过
frame <n>切换到上层栈帧,再用info locals查看局部变量。
- 检查上层函数的局部变量大小,若上层函数分配了大量栈内存,可能导致栈空间耗尽,后续push操作触发段错误。可通过
确认二进制与Core文件的匹配性
- 用
file命令检查二进制程序和Core文件信息:file <your-binary>、file <core-file>,确保两者编译版本、架构完全一致。若不匹配,反汇编和栈回溯结果会失真。
- 用
内容的提问来源于stack exchange,提问作者kirant
相关产品推荐
相关产品推荐

