【问题标题】:How to get cwd for relative paths?如何获取相对路径的 cwd?
【发布时间】:2015-06-13 18:46:21
【问题描述】:

对于使用相对路径调用的系统调用,如何在 strace 输出中获取当前工作目录?我正在尝试调试产生多个进程并且无法打开特定文件的复杂应用程序。

stat("some_file", 0x7fff6b313df0) = -1 ENOENT (No such file or directory)

由于some_file 存在,我相信它位于错误的目录中。我也尝试过跟踪 chdir 调用,但是由于输出是交错的,因此很难以这种方式推断出工作目录。有没有更好的办法?

【问题讨论】:

    标签: linux strace


    【解决方案1】:

    很简单,对当前目录使用函数 char *realpath(const char *path, char *resolved_pa​​th)。

    这是我的例子:

    #include <limits.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){
        char *abs;
    
        abs = realpath(".", NULL);
    
        printf("%s\n", abs);
        return 0;
    }
    

    输出

    root@ubuntu1504:~/patches_power_spec# pwd
    /root/patches_power_spec
    root@ubuntu1504:~/patches_power_spec# ./a.out 
    /root/patches_power_spec
    

    【讨论】:

    • 谢谢,但我的问题是关于 strace 输出。
    【解决方案2】:

    您可以使用-y 选项,它将打印完整路径。在这种情况下,另一个有用的标志是-P,它只跟踪与特定路径相关的系统调用,例如

    strace -y -P "some_file"
    

    不幸的是,-y 只会打印文件描述符的路径,并且由于您的调用没有加载任何文件描述符,因此它没有。一种可能的解决方法是在调试器中运行该系统调用时中断进程,然后您可以通过检查/proc/&lt;PID&gt;/cwd 获取其工作目录。像这样的东西(完全未经测试!)

    gdb --args strace -P "some_file" -e inject=open:signal=SIGSEGV
    

    或者您可以使用条件断点。像这样的应该工作,但我很难让 GDB 在分叉后跟随子进程。如果你只有一个进程,我认为应该没问题。

    gdb your_program
    break open if $_streq((char*)$rdi, "some_file")
    run
    print getpid()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2013-10-27
      相关资源
      最近更新 更多