对于使用相对路径调用的系统调用,如何在 strace 输出中获取当前工作目录?我正在尝试调试生成多个进程但无法打开特定文件的复杂应用程序。
stat("some_file", 0x7fff6b313df0) = -1 ENOENT (No such file or directory)
由于 some_file
存在,我相信它位于错误的目录中。我也曾尝试跟踪 chdir 调用,但由于输出是交错的,因此很难以这种方式推断出工作目录。有没有更好的办法?
最佳答案
您可以使用 -y
选项,它将打印完整路径。在这种情况下另一个有用的标志是 -P
它只跟踪与特定路径相关的系统调用,例如
strace -y -P "some_file"
不幸的是-y
只会打印文件描述符的路径,并且由于您的调用不加载任何它没有一个。一种可能的解决方法是在调试器中运行该系统调用时中断进程,然后您可以通过检查 /proc/<PID>/cwd
来获取其工作目录.像这样的东西(完全未经测试!)
gdb --args strace -P "some_file" -e inject=open:signal=SIGSEGV
或者您可以使用条件断点。像这样的东西应该 工作,但我很难让 GDB 在 fork 之后跟随子进程。如果你只有一个过程,我想应该没问题。
gdb your_program
break open if $_streq((char*)$rdi, "some_file")
run
print getpid()
关于linux - 如何获取相对路径的cwd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29520936/