GDB批量命令执行异常:thread apply all bt full参数失效问题
问题原因
直接将带空格和引号的命令存入变量后用$cmd执行时,Shell的参数拆分机制会破坏原有的参数边界:
- 命令行直接输入时,单引号是Shell语法,会把
thread apply all bt full整体作为-ex的参数传递给gdb。 - 存入变量再展开时,Shell会忽略单引号的语法作用,将
'thread、apply、all、bt、full'拆分成独立参数,导致gdb收到错误的指令,从而出现"apply: No such file or directory"等报错。
解决方法
方法1:使用数组存储命令(推荐,安全可靠)
用数组保存每个独立的命令参数,展开时能完整保留参数边界:
# 定义数组,每个元素对应一个命令参数 cmd=(/usr/bin/gdb -q --batch -ex 'thread apply all bt full' /proc/8969/exe /tmp/core.xxx) # 执行数组中的命令并捕获输出 ret=$("${cmd[@]}")
方法2:使用eval执行(谨慎使用,仅当变量内容完全可信时)
eval会重新解析命令字符串,恢复Shell的引号处理逻辑:
cmd="/usr/bin/gdb -q --batch -ex 'thread apply all bt full' /proc/8969/exe /tmp/core.xxx" ret=$(eval "$cmd")
内容的提问来源于stack exchange,提问作者ding kang
相关产品推荐
相关产品推荐

