strace 跟踪系统调用
strace -c 将进程所有的系统调用用作一个统计分析并返回。strace -c ./myapp
重新打开一个窗口,执行killall myapp
,可观察到系统调用的分析统计。
strace -o filename 将结果输出到文件filename中。
strace -T 将每个系统调用所花费的时间打印出来。结果体现在 <> 内。
strace -p pid 额外追踪现有的进程。其中,pid指的是进程id。
gdb
特点:
- 可以随心所欲的运行程序;
- 可以在断点调试;
- 在断点处,可以查看程序运行的状态;
- 可以改变程序的执行环境。
要使用gdb调试的前提是,必须使用g++ -g参数。
gdb ./myapp #开始调试
l #list 从第一行开始列出源码
Enter键 #表示重复上一次命令
b 15 #设置在源码 15 行处设置断点
b func #表示设置断点在函数func入口处
info break #表示查看断点的信息
r #表示运行程序 = run
n #表示单句执行 相当于IDE的F11
p i #打印遍历i p = print
p arr[i]#打印遍历 arr[i]
bt #查看函数堆栈
finish #跳出当前函数
q #结束调试
gdb定位coredump文件
coredump 核心转储错误,往往是程序运行时崩溃的错误,产生原因有
- 内存访问越界
- 多线程使用了线程不安全的函数
- 多线程读写的数据未加锁保护
- 非法指针,例如,int b =1; int *a; *a=b;
- 堆栈溢出
coredump文件存储的位置可通过命令:
cat /proc/sys/kernel/core_pattern查看
修改文件路径:
echo "...文件路径" > /proc/sys/kernel/core_pattern
比较重要的命令
top 性能分析工具、实时显示系统中各个进程的资源占用状况,类似于任务管理器。
ps (process status)运行的进程快照。
(1)显示特定用户
ps -u chiang
(2)显示所有进程的信息 ps -ef
(#-e = -A = a所有进程)(3)ps 和 grep的组合使用,显示特定进程
ps -ef|grep test
(4)ps -l 显示和pid相关信息列出来
(5)列出目前所有的正在内存中的程序
ps aux
kill 杀死进程
Valgrind 内存分析工具
内存分布 (低地址 –> 高地址)
- 代码段 (.text segment)
- 初始化数据段(.data segement) 已初始化的全局变量
- 未初始化数据段(.bss segement) BSS = - Block Started by Symbol 未初始化的全局变量
- 堆(heap) 低地址向上增长
- 栈(stack) 高地址向下增长
注:static声明的变量当做全局变量处理
使用Valgrind开源工具的memcheck可以检查内存泄露。
详细参考:[1]徐晓鑫 后台开发核心技术与应用实战 .