MacBook M1 Docker环境下调试amd64二进制文件的GDB输入重定向问题
解决方案
问题根源
你在shell中执行gdb ./test_input_x86_64 < my_test_input.txt时,文件内容被直接传给了gdb进程,而非被调试的test_input_x86_64程序,因此gdb会把Hello当成未知命令报错——这是重定向目标错误导致的,和Rosetta或Docker环境本身无关。
可行解决方法
方法1:启动程序时直接绑定输入文件
启动被调试程序时就完成输入重定向,再通过gdb连接Rosetta debugserver:
- 启动带输入重定向的程序并开启debugserver:
ROSETTA_DEBUGSERVER_PORT=1234 ./test_input_x86_64 < my_test_input.txt & - 启动gdb并加载程序符号:
gdb ./test_input_x86_64 - 连接到Rosetta debugserver:
target remote localhost:1234 - 正常设置断点、单步调试即可。如果需要在程序读取输入前中断,可以提前编写gdb命令脚本(比如写入
break main),用gdb -x debug_commands.txt ./test_input_x86_64启动。
方法2:在gdb中指定程序的输入源
如果程序已经通过debugserver启动且尚未读取输入,可在gdb中直接指定程序的输入文件:
- 按原有步骤启动程序和gdb并连接debugserver
- 在gdb中执行:
set inferior-tty my_test_input.txt - 执行
continue,程序会从指定文件读取输入。
方法3:混合文件输入与交互式调试
如果需要程序先读取文件内容,之后保留终端交互能力(方便调试时手动输入),可以用管道组合输入:
ROSETTA_DEBUGSERVER_PORT=1234 cat my_test_input.txt - | ./test_input_x86_64 &
之后按正常流程连接gdb调试即可,程序会先读取文件内容,再等待终端输入。
内容的提问来源于stack exchange,提问作者billwang
相关产品推荐
相关产品推荐

