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

如何将GDB格式化打印的结果按输出格式存储到内部变量以用于自定义Python命令

解决GDB中存储格式化二进制输出到内部变量的问题

首先得明确:GDB的自动变量(比如$17)确实只存储原始数值,p/t这类格式参数只是显示层面的修饰,不会改变变量存储的核心内容。不过要把格式化后的二进制字符串存下来给自定义Python命令用,有两种靠谱的实现方式:

方法1:用GDB内置命令捕获输出到变量

GDB的capture命令可以捕获其他命令的输出结果,然后把它存到一个自定义变量里。你可以这样操作:

# 捕获p/t的二进制输出,存到$bin_str变量中
capture set $bin_str = output p/t -123
# 验证变量内容,此时$bin_str就是二进制字符串
p $bin_str
# 输出示例:$1 = "11111111111111111111111110000101"

之后直接把$bin_str传给你的自定义Python命令即可:

my_custom_python_command $bin_str

方法2:在Python脚本里直接处理(更推荐)

既然你要调用自定义Python命令,其实完全可以跳过GDB的自动变量依赖,直接在Python里实现和p/t一致的补码转换逻辑,这样更灵活也不容易出问题。

比如你的Python脚本可以写成这样:

import gdb

class MyCustomPythonCommand(gdb.Command):
    def __init__(self):
        super().__init__("my_custom_python_command", gdb.COMMAND_USER)

    def invoke(self, arg, from_tty):
        # 解析传入的十进制数值
        num = int(arg)
        # 模拟GDB p/t的32位补码输出(需要64位就改64)
        bits = 32
        # 处理负数的补码转换
        if num < 0:
            bin_str = bin((1 << bits) + num)[2:]
        else:
            bin_str = bin(num)[2:].zfill(bits)
        # 此时bin_str就是和p/t完全一致的二进制字符串
        print(f"转换后的二进制:{bin_str}")
        # 这里可以添加你的自定义业务逻辑

# 注册命令到GDB
MyCustomPythonCommand()

把这个脚本保存为gdb_bin_convert.py,在GDB中加载:

source gdb_bin_convert.py

之后直接传入十进制数值调用命令就行:

my_custom_python_command -123

这种方法的好处是逻辑完全可控,不用依赖GDB的捕获命令,还能根据需求调整位数(32位/64位),和GDB原生的p/t行为完全对齐。


内容的提问来源于stack exchange,提问作者Wakan Tanka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:04:10