Как узнать, какая функция вызывает системный вызов? - PullRequest
0 голосов
/ 21 марта 2011

Я использую strace для отслеживания своего приложения и нахожу, что оно заблокировано при системном вызове «poll», я хочу выяснить, какая функция вызывает этот системный вызов. How100

Ответы [ 2 ]

3 голосов
/ 21 марта 2011

Скомпилировали ли вы свою программу с отладочной информацией (флаг -g для gcc)? Запустите ваш отладчик и получите трассировку стека!

Пример программы (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) 
0 голосов
/ 21 марта 2011

Просто введите:

gstack pid

чтобы получить трассировку стека вашей программы с указанным идентификатором процесса.

...