linux - 如何获取相对路径的cwd?

标签 linux strace

对于使用相对路径调用的系统调用,如何在 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/

相关文章:

c++ - 有没有一种标准的方法来捕获在 linux 和 windows 的 c++ 应用程序中工作的键盘输入?

linux - 如何设置gdb运行在/bin/sh

linux - 如何知道性能记录的最大事件周期

unix - strace 修复挂起的进程

c - 了解进程的执行环境

c++ - 为什么 C++ 和 strace 不同意 open() 系统调用需要多长时间?

c - Linux 中的软中断处理时序与硬中断处理时序

linux - 我在 linux 3.2.28 上的自定义模块如何调用 print_cpu_info?

android - 我如何使用 "strace"知道组件的系统调用

linux - 使 linux "Wait"命令等待所有子进程