无调试符号应用在gdb中调用系统命令及运行进程IO重定向问题
解决方案
一、修复GDB调用系统函数失败的问题
报错核心原因首先是进程attach失败,日志明确提示ptrace: No such process,说明指定的PID 6836对应的cat进程已经退出,和cat本身没有调试信息无关:close、open这类系统函数属于glibc的导出符号,不需要目标程序自带调试信息即可调用。
正确操作步骤如下:
- 先查询目标进程的有效PID,执行命令:
ps aux | grep cat - 临时关闭系统ptrace安全限制(多数发行版默认开启,会阻止gdb附加到其他进程):
sudo sysctl -w kernel.yama.ptrace_scope=0 - 用正确的PID执行attach操作:
sudo gdb -p [你查询到的有效PID] - 进入gdb交互界面后执行以下命令加载动态库符号:
之后就可以正常调用close、open、dup2这类函数完成重定向操作。set auto-solib-add on sharedlibrary
二、无需GDB/额外工具的重定向方案
所有Linux发行版默认都搭载proc文件系统,不需要安装任何额外工具即可实现运行中进程输出的收集:
- 如果只是需要采集进程后续的标准输出/错误内容,不需要修改进程本身的文件描述符指向,直接读取对应proc下的文件描述符即可:
# 替换[PID]为目标进程ID,执行后会将进程后续所有stdout输出写入/tmp/output.log cat /proc/[PID]/fd/1 > /tmp/output.log & # 如果要收集stderr,换成/proc/[PID]/fd/2即可 - 如果系统预装了基础工具包中的reptyr,还可以直接执行
reptyr -L [PID]快速修改进程输出指向,不需要操作gdb。
内容的提问来源于stack exchange,提问作者themean
相关产品推荐
相关产品推荐

