Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将coreutils跟踪到系统调用?_C_Linux_Gnu Coreutils - Fatal编程技术网

如何将coreutils跟踪到系统调用?

如何将coreutils跟踪到系统调用?,c,linux,gnu-coreutils,C,Linux,Gnu Coreutils,我试图导航并理解whoami(和其他coreutil),一直到最低级别的源代码,这只是一个练习 到目前为止,我的潜水: 实际的二进制文件在哪里 哪个whoami /usr/bin/whoami ./man/whoami.x ./man/whoami.1 ./src/whoami.c ./src/whoami ./src/whoami.o ./src/.deps/src_libsinglebin_whoami_a-whoami.Po ./src/.deps/whoami.Po 它在哪里维护

我试图导航并理解
whoami
(和其他coreutil),一直到最低级别的源代码,这只是一个练习

到目前为止,我的潜水:

  • 实际的二进制文件在哪里

    哪个whoami

    /usr/bin/whoami

  • ./man/whoami.x
    ./man/whoami.1
    ./src/whoami.c
    ./src/whoami
    ./src/whoami.o
    ./src/.deps/src_libsinglebin_whoami_a-whoami.Po
    ./src/.deps/whoami.Po
    
  • 它在哪里维护

  • 我如何获得来源

  • git克隆git://git.sv.gnu.org/coreutils

  • 存储库中的
    whoami
    源代码在哪里
  • #查找。|grep whoami

    ./man/whoami.x
    ./man/whoami.1
    ./src/whoami.c
    ./src/whoami
    ./src/whoami.o
    ./src/.deps/src_libsinglebin_whoami_a-whoami.Po
    ./src/.deps/whoami.Po
    
    相关行(84):

    这大概就是我的兔子洞停的地方
    geteuid()
    gnulib/lib/euidaccess.c
    中提到过,但没有在AICT中明确定义。它在
    /usr/local/unistd.h
    中也被引用为
    extern
    ,但我看不到与抓取uid相关的繁重工作

    我主要是通过在已知的系统头中对
    geteuid
    进行grepping来实现的,包括,因为我很难回溯它的定义

    问题:如何进一步深入了解
    geteuid()的源代码
    ?什么是最有效的方法来快速地探索这个代码库而不必到处乱翻


    我在Ubuntu服务器15.04上使用Vim和一些CTAG(这对导航现有的系统头没有多大帮助)。我是一个糟糕的开发人员,这是我的学习方法,尽管我无法克服这个障碍。

    通常你应该阅读
    geteuid
    的文档。您可以阅读开放组中的,或查阅手册页

    如果这没有帮助,您可以安装c库的调试符号(它被称为
    libc6 dbg
    或类似的东西)并下载
    libc6
    )的源代码,然后在进入库时指出源文件的路径

    在本例中,我认为这不会让您走得更远,在
    geteuid
    中可能发生的情况是,它只发出一个实际的系统调用,然后进入内核空间。不能像调试普通程序那样调试(内核)代码


    因此,在您的情况下,您最好查阅文档并仔细阅读,并尝试找出
    geteuid
    无法返回预期结果的原因。这可能会导致您改变对
    geteuid
    应该返回的内容的期望,以匹配实际返回的内容。

    geteuid()
    位于Unix标准库
    libc
    中。我想我正试图从一种更“艰难的方式”来实现这一点,法医方法,并查看geteuid的内部定义为触发系统调用的C函数的位置。我无法发现代码在哪里。正如我在原始注释中提到的,它似乎没有在unistd.h或sys/types.h中定义。我将研究如何安装调试符号,看看这能让我走多远。