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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:39:05