You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无调试信息下获取__malloc_printerr__变量值及解决程序崩溃问题

问题分析与解决思路

一、__malloc_printerr__反汇编中获取str和cp值的方法

针对Intel-64(x86_64)架构与gcc4.4.5编译的程序,遵循System V AMD64 ABI参数传递规则,可按以下方式获取变量值:

  • 前6个参数通过寄存器%rdi、%rsi、%rdx、%rcx、%r8、%r9传递,超出参数入栈存储。
  • 具体操作:
    1. 定位__malloc_printerr__的反汇编入口,识别变量对应的寄存器或栈偏移:若str为函数第一个参数,对应%rdi;若为栈上变量,以%rbp为基址计算偏移(反汇编中mov 0xXX(%rbp), %rax这类指令里的0xXX即为偏移量)。
    2. 在gdb中执行对应命令取值:
      # 假设str是第一个参数,取字符串指针指向的内容
      print *(char**)$rdi
      # 假设cp是第二个参数
      print *(char**)$rsi
      # 若变量在栈上,替换0xXX为实际偏移
      print *(char**)($rbp + 0xXX)
      

二、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调试技巧

  1. 查看hex_ip的内部结构:
    # 适配gcc4.4.5的std::basic_string<char>内存布局
    print *(struct {char* ptr; size_t len; size_t cap;}*)&hex_ip
    
  2. 检查hex_ip周边栈内存:
    # 打印hex_ip附近的栈内存,排查异常值
    x/32xg $rbp - 0x100
    
  3. 打印完整调用栈:
    bt full
    
    即使无调试信息,也能通过函数地址结合反汇编,排查调用链中的异常操作。

内容的提问来源于stack exchange,提问作者David Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:35:17