Skip to content

Latest commit

 

History

History
36 lines (30 loc) · 2.77 KB

File metadata and controls

36 lines (30 loc) · 2.77 KB

strace tips for better debugging

TL;DR

strace是Linux系统底层调试工具,主要用于追踪系统调用,适用于ARM64汇编、线程等不依赖libc的开发场景。其支持多进程/线程追踪(-f)、显示完整数据结构(-v)、控制输出(-s NUM -o file)、时间统计(-t -r -T)及指令指针定位(-i)。可通过-e选项按类别或路径筛选调用,并用-z/-Z限定成功/失败状态。利用注入功能(-e inject)可模拟错误、修改返回值或延迟执行,辅助测试异常场景。额外堆栈跟踪(-k)需配合编译选项,Golang需启用GODEBUG。最终通过-C生成调用统计摘要。

Summary

  • strace是用于调试Linux系统调用的强大工具,适用于不依赖libc的底层编程场景,如ARM64汇编开发、线程实现等。
  • 常用命令参数:
    • -f:追踪子进程/线程,解决多线程或多进程时的系统调用跟踪需求。
    • -v:显示完整结构数据(如stat、termios),联合-s参数用于检查汇编代码中结构初始化及字节序问题。
    • -s NUM:控制最大字符串输出长度,适合处理较大结构体。
    • -o:将输出保存到日志文件,方便后续分析。
    • -yy:扩展文件描述符信息,显示文件路径或网络地址。
    • -Y:显示系统调用关联的进程名,辅助验证shell执行的程序是否正确。
    • -t/-r:显示绝对/相对时间戳,辅助调试时间相关问题。
    • -T:显示每次系统调用耗时,支持基础性能分析(但会影响进程速度)。
    • -n:输出系统调用编号,便于快速获取新架构的调用号。
    • -i:记录系统调用时的指令指针,定位汇编代码中的错误位置。
    • -C:结束时生成统计摘要,包含调用次数、时间及错误详情。
  • 堆栈跟踪:
    -k(需结合编译选项-g)或--stack-trace可打印调用堆栈,尤其在调试Golang程序时,需通过GODEBUG启用该功能。
  • 系统调用筛选:
    strace -e选项根据调用类别(如%net网络、%mem内存)或路径(-P /路径)过滤输出。结合-z(仅失败)和-Z(仅成功)选项,精准定位特定场景的问题。
  • 系统调用注入:
    -e inject可修改特定系统调用行为,例如:
    • error=EINVAL制造错误(如open失败后显示(INJECTED)标记)
    • retval改写返回值
    • signal注入信号
    • delay_enter/delay_exit延迟调用执行 适用于测试失败场景或调试系统调用逻辑是否正确。示例:strace -e inject=%file:error=ENOENT:when=3+ ls在第三次及后续文件操作调用时返回找不到文件错误。