无调试信息下获取__malloc_printerr__变量值及解决程序崩溃问题
问题分析与解决思路
一、__malloc_printerr__反汇编中获取str和cp值的方法
针对Intel-64(x86_64)架构与gcc4.4.5编译的程序,遵循System V AMD64 ABI参数传递规则,可按以下方式获取变量值:
- 前6个参数通过寄存器
%rdi、%rsi、%rdx、%rcx、%r8、%r9传递,超出参数入栈存储。 - 具体操作:
- 定位__malloc_printerr__的反汇编入口,识别变量对应的寄存器或栈偏移:若
str为函数第一个参数,对应%rdi;若为栈上变量,以%rbp为基址计算偏移(反汇编中mov 0xXX(%rbp), %rax这类指令里的0xXX即为偏移量)。 - 在gdb中执行对应命令取值:
# 假设str是第一个参数,取字符串指针指向的内容 print *(char**)$rdi # 假设cp是第二个参数 print *(char**)$rsi # 若变量在栈上,替换0xXX为实际偏移 print *(char**)($rbp + 0xXX)
- 定位__malloc_printerr__的反汇编入口,识别变量对应的寄存器或栈偏移:若
二、std::basic_string::assign/析构崩溃(hex_ip局部变量)
常见触发原因
- 栈内存破坏:hex_ip作为局部std::string,若同栈内其他变量存在数组越界、指针非法写入等操作,会破坏其内部的指针/长度/容量结构(gcc4.4.5中std::basic_string
通常包含ptr、len、cap三个核心成员)。 - 野指针/重复释放:若hex_ip的内部数据指针被非法指向已释放内存,或内存被重复释放,会在assign或析构时触发崩溃。
- 线程安全问题:若hex_ip被多线程无同步访问,会导致内部状态损坏。
无完整调试信息时的gdb调试技巧
- 查看hex_ip的内部结构:
# 适配gcc4.4.5的std::basic_string<char>内存布局 print *(struct {char* ptr; size_t len; size_t cap;}*)&hex_ip - 检查hex_ip周边栈内存:
# 打印hex_ip附近的栈内存,排查异常值 x/32xg $rbp - 0x100 - 打印完整调用栈:
即使无调试信息,也能通过函数地址结合反汇编,排查调用链中的异常操作。bt full
内容的提问来源于stack exchange,提问作者David Wang
相关产品推荐
相关产品推荐

