【问题标题】:How to know which function is calling system call?如何知道哪个函数正在调用系统调用?
【发布时间】:2011-03-21 00:43:15
【问题描述】:

我使用 strace 跟踪我的应用程序,发现它在系统调用“poll”时被阻塞,我想弄清楚哪个函数正在调用这个系统调用。如何?

【问题讨论】:

    标签: linux system trace system-calls strace


    【解决方案1】:

    您是否使用调试信息(gcc 的-g 标志)编译了您的程序?启动调试器并获取堆栈跟踪!

    示例程序(example.c):

    #include <poll.h>
    
    void f2(void)
    {
      struct pollfd fd = {0, POLLERR, POLLERR};
      poll(&fd, 1, -1);
    }
    
    void f1(void)
    {
      f2();
    }
    
    int main(int argc, char **argv[])
    {
      f1();    
      return 0;
    }
    

    构建和回溯示例:

    $ CFLAGS=-g make example
    cc -g    example.c   -o example
    $ gdb example    
    (gdb) run
    Starting program: example 
    Reading symbols for shared libraries +. done
    ^C
    Program received signal SIGINT, Interrupt.
    0x00007fff821751a6 in poll ()
    (gdb) bt
    #0  0x00007fff821751a6 in poll ()
    #1  0x0000000100000ea6 in f2 () at example.c:6
    #2  0x0000000100000eb1 in f1 () at example.c:11
    #3  0x0000000100000ec7 in main (argc=1, argv=0x7fff5fbff750) at example.c:16
    (gdb) 
    

    【讨论】:

      【解决方案2】:

      只需输入:

      gstackpid

      获取具有指定进程 ID 的程序的堆栈跟踪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 2014-07-10
        • 2011-03-21
        • 2019-11-13
        相关资源
        最近更新 更多