Linux系统怎么用strace跟踪C++程序的系统调用

轻瑶同学_8754

轻瑶同学_8754

2026-10-03

859人浏览

原创

strace 是 linux 下无需改代码、不依赖符号即可实时跟踪 c++ 等任意语言程序系统调用的核心工具,常用方式为 strace ./my_program,配合 -t -tt 查耗时与时间戳,-p pid 动态附加,-e trace=open,connect 精准过滤,-c 统计瓶颈,并需注意重定向程序输出、加 -f 跟踪子进程、设 -s 256 防路径截断。

linux系统怎么用strace跟踪c++程序的系统调用

直接用 strace 就能跟踪,不需要改代码、不依赖调试符号、也不用重新编译。 它看到的是进程实际发出的系统调用,和语言无关——C++ 程序启动后,execve、open、read、write、socket 这些调用照常被记录下来。

怎么启动一个 C++ 程序并实时看它的系统调用

最常用也最直接的方式:

strace ./my_program

如果程序输出太多(比如带 std::cout),建议把程序 stdout/stderr 重定向,避免和 strace 的日志混在一起:

strace -T -tt ./my_program > /dev/null 2>&1

其中:
- -T 显示每个系统调用耗时(关键!能看出卡在哪)
- -tt 打印微秒级时间戳(便于对齐行为时序)
- > /dev/null 2>&1 把程序自己的输出全吃掉,只留 strace 的跟踪日志在终端

常见漏点:
- 忘了加 -T,结果只看到调用名,看不出是快是慢
- 没屏蔽程序输出,日志滚动太快,根本找不到 open 或 connect 那行
- 用 ./my_program | strace 是错的——strace 跟踪的是管道左边的 shell 进程,不是你的程序

程序已经跑起来了,怎么 attach 上去

比如你发现某个后台 C++ 服务响应变慢,但没开调试模式:

strace -p $(pidof my_service) -T -s 256

Alpine Linux
Alpine Linux

获取最新发布版本;聚合最新版本架构

下载

说明:
- -p 后必须跟真实 PID,pidof 要确保匹配唯一进程(多个同名进程时建议用 pgrep -f "my_service")
- -s 256 把字符串参数截断长度从默认 32 字节提到 256,否则像 open("/very/long/config/path.yaml", ...) 只能看到 open("/very/long/conf...", ...)
- 如果程序开了多线程,记得加 -f,否则只看到主线程的调用

容易踩的坑:
- strace -p 1234 后按 Ctrl+C 会向目标进程发 SIGINT,可能意外中断服务
- 没加 -f 却在跟踪一个 fork 多进程的 C++ 服务(如用 fork() 做 worker 模型),会漏掉子进程行为
- 在容器里运行时,pidof 查到的是宿主机 PID,但 strace -p 需要进入容器命名空间才能 attach,否则报 Operation not permitted

只想看文件或网络相关的系统调用

C++ 程序出问题,往往集中在几个场景:配置文件打不开、日志写失败、连不上数据库、DNS 解析卡住。这时候过滤比全量日志更高效:

strace -e trace=open,close,read,write,stat,fstat ./my_program 2>&1 | grep -E "(ENOENT|EACCES|Permission denied)"

或者专盯网络:

strace -e trace=socket,connect,bind,sendto,recvfrom,accept4 -T ./my_program

注意点:
- -e trace=network 是快捷写法,但部分老版本 strace 不支持,保险起见还是列具体调用名
- getaddrinfo 是库函数,不是系统调用,strace 看不到;它背后实际触发的是 open(读 /etc/resolv.conf)、sendto/recvfrom(UDP 查询)等,所以得看底层调用
- epoll_wait、poll、select 这类 I/O 多路复用调用,经常是阻塞点,别漏掉它们

输出太长没法人工看,怎么快速定位问题

别硬翻几千行日志。优先用这几个组合:

strace -c ./my_program 2>&1 → 看统计摘要,找出调用次数最多或耗时最长的几项
strace -o trace.log ./my_program → 全量存盘,再用 grep 或 awk 挖关键线索
strace -T ./my_program 2>&1 | awk '$NF ~ // && substr($NF,2,length($NF)-2)+0 > 0.1 {print}' → 找出所有耗时超 100ms 的调用

真正难的不是“怎么输出”,而是理解返回值含义:
- open("/path/to/file", O_RDONLY) = -1 ENOENT (No such file or directory):文件不存在,但程序没处理这个错误
- connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress):非阻塞 socket 正在连接中,正常
- write(2, "error: ...\n", 12) = -1 EAGAIN (Resource temporarily unavailable):stderr fd 被设成非阻塞且缓冲区满,可能掩盖真实错误
这些细节不结合上下文和 errno 手册页,很容易误判。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux c++ linux系统

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2208

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

979

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

407

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

386

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1197

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习