GDB中如何将变量值作为dump binary memory命令的文件名参数
dump binary memory的文件名参数 问题描述
我尝试将存储在$filename变量中的值传递给GDB的dump binary memory命令,相关代码片段如下:
set $start = table[0].mem_ptr set $length = table[0].mem_ptr + table[0].mem_len set $filename = table[0].fname dump binary memory $filename $start $length
由于dump binary memory的第2、3个参数是数值类型,直接传递变量没有问题,但第一个参数要求是字符串。假设$filename变量内容为temp.bin,执行命令后GDB会创建名为$filename的文件而非temp.bin,无法正确使用变量中的文件名。我曾尝试命令:dump binary memory eval "p $filename" $start $length,但GDB返回错误信息Unterminated string in expression.,不知道如何正确处理该参数以使用变量中存储的字符串。
我的GDB版本信息:
GNU gdb (GNU Tools for ARM Embedded Processors) 7.6.0.20140529-cvs Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=i686-w64-mingw32 --target=arm-none-eabi". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>.
解决方案
方法1:用eval动态构造完整命令
GDB的eval命令可以用来拼接动态命令字符串,将变量值插入到dump binary memory命令中,正确写法如下:
eval "dump binary memory %s %x %x", $filename, $start, $length
%s用于替换字符串类型的$filename变量%x用于替换十六进制格式的内存地址(如果地址是十进制,可改用%d)
方法2:借助Python脚本实现(适配GDB 7.6+)
如果你的GDB支持Python嵌入(7.6版本已支持),可以用Python直接处理变量和文件写入,逻辑更灵活:
python start = gdb.parse_and_eval('$start') end = gdb.parse_and_eval('$length') filename = gdb.parse_and_eval('$filename').string() with open(filename, 'wb') as f: f.write(gdb.inferiors()[0].read_memory(int(start), int(end - start))) end
这段代码会读取GDB变量,将$filename转换为Python字符串,然后直接从目标进程读取指定内存范围并写入文件。
错误原因说明
你之前的写法dump binary memory eval "p $filename" $start $length错误在于:dump命令的第一个参数需要直接传入字符串,而eval不能作为dump的参数使用——eval本身是用来执行构造好的完整命令,而非作为参数传递。必须通过eval生成整个dump命令,或用Python绕开GDB原生命令的参数限制。
内容的提问来源于stack exchange,提问作者Fatih M.

