如何在GDB中调用自定义Python命令且不输出无用空字符串?
解决GDB全局
set print elements限制下查看完整字符串的无冗余输出问题 GDB的set print elements是全局设置,会影响所有类数组类型的输出长度。为避免大量冗余输出,通常会将其设为较小值(比如set print elements 4),但遇到需要查看完整字符串的场景时,不想临时修改全局设置再改回去。
之前编写的wholestring自定义Python函数(基于gdb.Function)虽然能显示完整字符串,但通过p或call调用时会额外输出无用的空字符串;直接调用$wholestring又会报错,因为它属于表达式函数,只能在表达式上下文中使用。
解决方案:改为GDB命令实现
将原有的gdb.Function改为gdb.Command,这样可以直接作为GDB命令调用,无需返回值,自然不会产生冗余输出。
修改后的代码:
import gdb class WholeStringCmd(gdb.Command): def __init__(self): # 注册命令名为wholestring,归类为用户自定义命令 super(WholeStringCmd, self).__init__("wholestring", gdb.COMMAND_USER) def invoke(self, arg, from_tty): # 解析输入的表达式,获取目标字符串值 try: target_val = gdb.parse_and_eval(arg) except gdb.error as err: print(f"解析表达式失败: {err}") return # 保存当前print elements的设置值 show_output = gdb.execute("show print elements", True, True) current_elements = show_output[:-2].split(" ")[-1] # 临时设置为0以显示完整字符串 gdb.execute("set print elements 0") print(f"[完整字符串: {target_val}]") # 恢复原来的设置 if int(current_elements) > 0: gdb.execute(f"set print elements {current_elements}") # 实例化命令类,完成注册 WholeStringCmd()
使用方式
将上述代码保存为wholestring.py,在GDB中通过source wholestring.py加载后,直接调用命令即可:
(gdb) wholestring "a string longer than the current 'print elements'" [完整字符串: "a string longer than the current 'print elements'"]
这样既不会输出冗余的空字符串,也能直接调用,完美满足需求。
原方案问题说明
- 基于
gdb.Function的实现是表达式函数,必须返回一个GDB值对象,因此用p/call调用时会显示返回的空字符串。 - 表达式函数只能在表达式上下文(如
p $func(...))中使用,直接输入$wholestring(...)会被当作GDB命令,自然报错。
内容的提问来源于stack exchange,提问作者Byron Hawkins
相关产品推荐
相关产品推荐

