后台开发核心技术与应用实践读书笔记(五)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40028201/article/details/89569675

后台核心技术开发与应用实践读书笔记(五)

第五章 调试

5.1 strace

  1. 通过跟踪系统调用观察程序在后台所做的事情
  2. 跟踪信号传递
  3. 统计系统调用

5.2 gdb

  1. 常用的调试命令

    命令 描述
    backtrace(或bt) 查看各级函数调用及参数
    finish 连续运行到当前函数返回为止,然后停下来等待命令
    frame(或f) 帧编号 选择栈帧
    info(或i) locals 查看当前栈帧局部变量的值
    list(或l) 列出源代码,接着上次的位置往下列,每次列10行
    list 行号 列出从第几行开始的源代码
    list 函数名 列出某个函数的源代码
    b 行号 在第几行设置断点
    b 函数名 在函数处设置断点
    next(或n) 执行下一行语句
    print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数
    quit(或q) 退出gdb调试环境
    set var 修改变量的值
    start 开始执行程序,停在main函数第一行语句前面等待命令
    step(或s) 执行下一行语句,如果有函数调用则进入到函数中
  2. 使用gdb分析coredump文件

5.3 top

​ top 命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于windows下的任务管理器

5.4 ps

​ ps 命令列出的是当前在运行的程序的进程快照

参数 功能
a 显示所有进程
-a 显示同一终端下的所有程序
-A 显示所有进程
c 显示进程的真实名称
-N 反向选择
-e 等于“-A”
e 显示环境变量
f 显示程序间的关系
-H 显示树状结构
r 显示当前终端的进程
T 显示当前终端的所有程序
u 指定用户的所有进程
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程
-C<命令> 列出指定命令的状况
–lines<行数> 每页显示的行数
–width<字符数> 每页显示的字符数
–help 显示帮助信息
–version 显示版本显示

5.5 Valgrind

​ Valgrind是一款内存分析工具

  1. 主要包括以下工具

    1.Memcheck。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。
    2.Callgrind。它主要用来检查程序中函数调用过程中出现的问题。
    3.Cachegrind。它主要用来检查程序中缓存使用出现的问题。
    4.Helgrind。它主要用来检查多线程程序中出现的竞争问题。
    5.Massif。它主要用来检查程序中堆栈使用中出现的问题。
    6.Extension。可以利用core提供的功能,自己编写特定的内存调试工具

  2. linux 下C语言程序的内存布局

    这里写图片描述

  3. 堆栈的区别

    1. 申请方式
      • 栈:系统自动分配
      • 堆:需要程序员自己申请,并指明大小
    2. 申请后响应时间不同
      • 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则报异常,提示栈溢出
      • 堆:
        • 首先:申请是遍历操作系统内存地址的链表找到第一个大于申请空间的堆节点,然后删除该节点,并将空间分配给程序
        • 其次:大多数系统会将这系统会将首地址处记录本次分配大小(delete才能正确释放),并将多余的那部分放入空闲链表中。
        • 会产生碎片问题(外部碎片)–>(固定分区存在内部碎片(分配大于实际),可变分区存在外部碎片(太碎无法分配))。
    3. 申请大小的限制不同
      • 栈:1或者2M,可以自己改,最大是8M
      • 堆: 不连续的内存区域,遍历方向由低地址向高地址,堆的大小受限于计算机操作系统的虚拟内存
    4. 申请效率不同
      • 栈: 自动分配,比较快,程序员无法控制
      • 堆:new,速度慢,容易产生内存碎片,用起来方便
    5. 储存内容不同
      • 栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条语句)的地址,然后是各个参数(从右往左进栈),然后是局部变量(静态变量不入栈)。调用结束后局部变量先出栈,然后参数,最后栈顶指针最先存的地址也就是主函数的下一条指令,程序由该点继续运行
      • 堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员决定
  4. 内存空间布局

    1. 传入的参数,局部变量,都是在栈顶分布,随着子函数的增多而往下增长
    2. 函数的调用地址(函数运行代码),全局变量,静态变量都是分配在内存的底部存在,而malloc分配的堆则存在这些内存之上并向上增长
  5. Valgrind安装/使用

索引

  1. 第 1 章 C++常用的编程技术
  2. 第 2 章 面向对象C++
  3. 第 3 章 常用的STL使用
  4. 第 4 章 编译
  5. 第 5 章 调试
  6. 第 6 章 TCP协议
  7. 第 7 章 网络IO模型
  8. 第 8 章 网络分析工具
  9. 第 9 章 多线程
  10. 第 10 章 进程
  11. 第 11 章 进程间通信
  12. 第 12 章 HTTP协议

猜你喜欢

转载自blog.csdn.net/qq_40028201/article/details/89569675