GDB如何设置使用相对路径调用被调试程序
GDB相对路径调用被调试程序的实现方案及路径逻辑说明
你之前编写汇编时遇到的相对路径输出截断问题属于业务代码逻辑问题,和GDB的路径处理逻辑无关。
你之前用set args无效的本质原因是,set args只能配置argv[1]及之后的程序入参,而程序路径对应的是argv[0],不属于该命令的配置范围。你修改栈内存后gdb仍输出绝对路径,是因为gdb自身会单独存储一份已加载可执行文件的绝对路径用于自身日志输出,和进程内存中的argv[0]无关,只要你通过x /s查看argv[0]地址的内容是你设置的相对路径,就说明修改已经对被调试进程生效。
实现相对路径调用的方法
- 方法1:启动gdb时直接传入相对路径
先cd到可执行文件所在的目录,直接执行gdb ./progname,此时默认传给进程的argv[0]就是./progname,无需额外配置。 - 方法2:显式指定argv[0](适用于已加载绝对路径可执行文件的场景)
直接执行gdb命令set argv0 ./progname,之后再执行run启动程序,被调试进程拿到的argv[0]就是你设置的相对路径。 - 方法3:兼容旧版本gdb的wrapper方案
如果你的gdb版本不支持set argv0命令,可以通过exec-wrapper调用bash的exec命令覆盖argv[0],执行以下命令:
之后正常run启动程序即可生效。set exec-wrapper bash -c 'exec -a "./progname" "$0" "$@"'
GDB路径处理逻辑说明
- 加载可执行文件时,gdb会把你输入的路径解析为绝对路径,用于查找文件、加载符号,这个解析后的路径会存在gdb的内部变量中,作为gdb自身输出时的程序路径,不会随进程内存的修改而变化。
- 默认情况下,gdb会把你输入可执行文件时的原始路径作为argv[0]传给被调试进程,如果你输入的是绝对路径,进程拿到的argv[0]就是绝对路径。
set argv0命令的优先级最高,只要配置了该值,就会覆盖默认的argv[0]传给进程,和你加载文件时用的路径无关。
内容的提问来源于stack exchange,提问作者Anton Tretyakov
相关产品推荐
相关产品推荐

