如何将GDB中pipe命令的输出赋值给变量?
解决GDB捕获命令输出到用户变量的问题
问题场景
执行以下GDB命令可得到目标地址:
(gdb) pipe monitor get info | grep cross2_Release.nss | cut -c 3-13 0x566f80400
但直接执行set $main = 'pipe monitor get info | grep cross2_Release.nss | cut -c 3-14'会报错:
No symbol table is loaded. Use the "file" command.
需要将输出0x566f80400赋值给GDB用户变量$main。
正确实现方式
方法1:借助临时文件中转
先通过shell命令把输出写入临时文件,再读取内容赋值:
# 将命令输出写入临时文件 shell pipe monitor get info | grep cross2_Release.nss | cut -c 3-13 > /tmp/gdb_tmp_addr.txt # 读取文件内容并转为数值赋值给$main set $main = (unsigned long long)strtoul("$(cat /tmp/gdb_tmp_addr.txt)", 0, 16) # 可选:清理临时文件 shell rm /tmp/gdb_tmp_addr.txt
方法2:使用GDB内嵌Python脚本(更简洁)
利用GDB的Python API直接捕获命令输出并赋值:
python import gdb # 执行命令并捕获输出,去除首尾空白 addr_output = gdb.execute('pipe monitor get info | grep cross2_Release.nss | cut -c 3-13', to_string=True).strip() # 将输出赋值给GDB用户变量$main gdb.execute(f'set $main = {addr_output}') end
方法3:用eval结合shell命令
通过shell命令获取输出后,直接用eval完成赋值:
eval "set $main = %s", shell pipe monitor get info | grep cross2_Release.nss | cut -c 3-13
原命令失败原因
原命令set $main = 'pipe ...'是把字符串字面量赋值给变量,但GDB会尝试将这个字符串解析为表达式,由于没有加载符号表(且该字符串本身不是合法的数值表达式),因此抛出错误。正确逻辑是先执行管道命令捕获输出,再将输出作为数值赋值给变量。
内容的提问来源于stack exchange,提问作者gnaomo
相关产品推荐
相关产品推荐

