Linux 如何知道哪个函数正在调用系统调用?

Linux 如何知道哪个函数正在调用系统调用?,linux,system,trace,system-calls,strace,Linux,System,Trace,System Calls,Strace,我使用strace跟踪我的应用程序,发现它在系统调用“poll”时被阻止,我想知道哪个函数正在调用此系统调用。如何使用调试信息编译程序(gcc的-g标志)?启动调试器并获取堆栈跟踪 示例程序(Example.c): 您是否使用调试信息编译程序(gcc的-g标志)?启动调试器并获取堆栈跟踪 示例程序(Example.c): 仅键入: gstackpid 要获取具有指定进程id的程序堆栈跟踪,只需键入: gstackpid 获取具有指定进程id的程序堆栈跟踪 #include <poll.h&

我使用strace跟踪我的应用程序,发现它在系统调用“poll”时被阻止,我想知道哪个函数正在调用此系统调用。如何使用调试信息编译程序(gcc的
-g
标志)?启动调试器并获取堆栈跟踪

示例程序(Example.c):


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

示例程序(Example.c):

仅键入:

gstack
pid

要获取具有指定进程id的程序堆栈跟踪,只需键入:

gstack
pid

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

#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)