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

本文深入探讨了后端开发中的关键调试技术,包括strace系统调用跟踪、gdb调试命令详解、top和ps的性能监控、以及Valgrind内存分析工具的使用。详细介绍了如何使用gdb进行函数调用、变量查看、断点设置等,同时解析了Valgrind下Memcheck、Callgrind、Cachegrind等工具的功能,帮助开发者有效定位和解决内存错误、性能瓶颈等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

第五章 调试

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协议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值