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

标签 linux system trace system-calls strace

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

最佳答案

您是否使用调试信息(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) 

关于linux - 如何知道哪个函数正在调用系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5372730/

相关文章:

php - 可靠的 mp3 分割 php 类或任何 Linux 工具

.net - 配置 Jenkins 以在 Linux 平台上运行 MSBuild

C# 取消 Windows 关机

C# 即使具有管理员权限也无法访问系统文件

system - 学习安全关键系统开发 (C/C++) 的最佳资源是什么

c++ - 在 C++ 中跟踪递归阶乘函数?

HTTP 请求跟踪

linux - 如何在没有 git 的情况下设置rapidjson

c - 在 C 中实现 ls -al 命令

c# - WCF 跟踪和消息日志记录不会在服务主机(服务器)端写入日志文件