【发布时间】:2011-03-21 00:43:15
【问题描述】:
我使用 strace 跟踪我的应用程序,发现它在系统调用“poll”时被阻塞,我想弄清楚哪个函数正在调用这个系统调用。如何?
【问题讨论】:
标签: linux system trace system-calls strace
我使用 strace 跟踪我的应用程序,发现它在系统调用“poll”时被阻塞,我想弄清楚哪个函数正在调用这个系统调用。如何?
【问题讨论】:
标签: linux system trace system-calls strace
您是否使用调试信息(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)
【讨论】:
只需输入:
gstackpid
获取具有指定进程 ID 的程序的堆栈跟踪。
【讨论】: