c/c++ Linux下编程调试

  • strace 跟踪系统调用
  • gdb
    • gdb定位coredump文件
    • Valgrind 内存分析工具

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]徐晓鑫 后台开发核心技术与应用实战 .

你可能感兴趣的:(ubuntu)