Linux下调试指令——strace和gdb

strace

1.strace指令

strace指令
用法: strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]...
              [-a column] [-o file] [-s strsize] [-P path]...
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]
   or: strace -c[dfw] [-I n] [-e expr]... [-O overhead] [-S sortby]
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]

输出格式:
  -a column      用于打印系统调用结果的列对齐column(默认值为40)
  -i             系统调用时打印指令指针
  -o file        send trace output to FILE instead of stderr
  -q             禁止显示有关附加、分离等的消息
  -r             打印相对时间戳
  -s strsize     将打印字符串的长度限制为STRIZE字符(默认为32个)
  -t             打印绝对时间戳
  -tt            使用usecs打印绝对时间戳
  -T             每次系统调用花费的打印时间
  -x             以十六进制打印非ASCII字符串
  -xx            以十六进制打印所有字符串
  -y             打印与文件描述符参数关联的路径
  -yy            打印ip:与套接字文件描述符关联的端口对

统计数据:
  -c             计算每个系统调用的时间、调用和错误,并报告摘要
  -C             类似于-c,但也打印常规输出
  -O overhead    开销跟踪系统调用到overhead usecs的设置开销
  -S sortby      sortby排序系统调用计数依据:时间,调用,名称,无(默认时间)
  -w             总结系统调用延迟(默认为系统时间)

过滤:
  -e expr        一个限定表达式: option=[!]all or option=[!]val1[,val2]...
     options:    trace, abbrev, verbose, raw, signal, read, write
  -P path        跟踪访问路径

跟踪:
  -b execve      系统调用上的execve分离
  -D             run tracer process as a detached grandchild, not as parent
  -f             follow forks
  -ff            follow forks with output into separate files
  -I interruptible
     1:          no signals are blocked
     2:          fatal signals are blocked while decoding syscall (default)
     3:          fatal signals are always blocked (default if '-o FILE PROG')
     4:          fatal signals and SIGTSTP (^Z) are always blocked
                 (useful to make 'strace -o FILE PROG' not stop on ^Z)

启动:
  -E var         var从命令环境中删除var
  -E var=val     put var=val in the environment for command
  -p pid         具有进程id PID的跟踪进程,可以重复
  -u username    run command as username handling setuid and/or setgid

其他:
  -d             enable debug output to stderr
  -v             verbose mode: print unabbreviated argv, stat, termios, etc. args
  -h             print help message
  -V             print version
  
Ctrl + C   退出strace

2.用法示例

  现在有一个程序运行后的cpu占用率为100%,过了一会儿后cpu占用率又恢复正常了,如何找到问题所在?
  假设这个可执行程序为 test

# 一个终端运行有问题的程序
./test

# 另一个终端运行 strace
sudo strace -o strace.log -c -t -p `pgrep test`
# 表示跟踪含有test的的进程,打印绝对时间戳和计算每个系统调用的时间、调用和错误,并报告摘要,将这些信息写入到 strace.log 文件中

# 待 test 的cpu占用率恢复正常后,Ctrl + C 退出strace,并查看strace.log文件进行分析

Linux下调试指令——strace和gdb_第1张图片

3.利用strace查故障

  • 找出程序在startup的时候读取的哪个config文件?
  • 为什么这个程序没有打开我的文件?
  • 某个进程现在在做什么?
  • 为什么无法连接到服务器?

https://www.cnblogs.com/youxin/p/8837771.html

sudo strace -c -p `pgrep test`

Linux下调试指令——strace和gdb_第2张图片

参考:
https://blog.csdn.net/qq_38951990/article/details/117085293

gdb

1.gdb调试指令

命令               简写形式         说明
backtrace          bt、where       显示backtrace
break              b               设置断点
continue           c、cont         继续执行
delete             d               删除断点
finish                             运行到函数结束
info breakpoints                   显示断点信息
next               n               执行下一行
print              p               显示表达式
run                r               运行程序
step               s               一次执行一行,包括函数内部
x                                  显示内存内容
until              u               执行到指定行
其他命令
directory          dir             插入目录
disable            dis             禁用断点
down               do              在当前调用的栈帧中选择要显示的栈帧
edit               e               编辑文件或者函数
frame              f               选择要显示的栈帧
forward-search     fo              向前搜索
generate-core-file gcore           生成内核转存储
help                h              显示帮助一览
info                i              显示信息
list                l              显示函数或行
nexti               ni             执行下一行(以汇编代码为单位)
print-object        po             显示目标信息
sharelibrary        share          加载共享的符号
stepi               si             执行下一行
# 程序发生了崩溃或卡住,使用gdb调试
sudo gdb -p `pgrep test`

run

bt

q

https://blog.csdn.net/lovely_dzh/article/details/109160337
https://www.cnblogs.com/lsgxeva/p/8024867.html

你可能感兴趣的:(Linux,linux,strace)