第17章 总结
完整 485 页的 《编译与调试完全指南》见: lengjingzju-notes发布页
本章对全书16章的知识体系进行整体回顾,梳理从编译到调试的完整工具链脉络,提供按问题域组织的工具选择速查表、调试流程决策图和学习路径建议,帮助读者建立系统化的知识框架,在实际工作中快速定位问题并选择合适的工具。
17.1 全书知识体系总览
本书围绕 Linux 下 C/C++ 程序的"编译→分析→调试→监控→调优"全生命周期,构建了完整的知识体系。
#mermaid-svg-vKe5SzKkTQZEQau7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vKe5SzKkTQZEQau7 .error-icon{fill:#552222;}#mermaid-svg-vKe5SzKkTQZEQau7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vKe5SzKkTQZEQau7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vKe5SzKkTQZEQau7 .marker.cross{stroke:#333333;}#mermaid-svg-vKe5SzKkTQZEQau7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vKe5SzKkTQZEQau7 p{margin:0;}#mermaid-svg-vKe5SzKkTQZEQau7 .edge{stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .section--1 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section--1 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section--1 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section--1 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section--1 text{fill:#ffffff;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth--1{stroke-width:17;}#mermaid-svg-vKe5SzKkTQZEQau7 .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-0 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-0 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-0 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-0 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-0 text{fill:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-0{font-size:40px;color:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-0{stroke-width:14;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-1 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-1 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-1 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-1 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-1 text{fill:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-1{font-size:40px;color:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-1{stroke-width:11;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-2 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-2 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-2 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-2 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-2 text{fill:#ffffff;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-2{stroke-width:8;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-3 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-3 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-3 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-3 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-3 text{fill:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-3{font-size:40px;color:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-3{stroke-width:5;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-4 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-4 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-4 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-4 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-4 text{fill:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-4{font-size:40px;color:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-4{stroke-width:2;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-5 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-5 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-5 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-5 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-5 text{fill:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-5{font-size:40px;color:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-5{stroke-width:-1;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-6 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-6 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-6 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-6 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-6 text{fill:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-6{font-size:40px;color:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-6{stroke-width:-4;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-7 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-7 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-7 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-7 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-7 text{fill:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-7{font-size:40px;color:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-7{stroke-width:-7;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-8 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-8 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-8 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-8 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-8 text{fill:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-8{font-size:40px;color:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-8{stroke-width:-10;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-9 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-9 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-9 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-9 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-9 text{fill:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-9{font-size:40px;color:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-9{stroke-width:-13;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-10 rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-10 path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-10 circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-10 polygon,#mermaid-svg-vKe5SzKkTQZEQau7 .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-10 text{fill:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .node-icon-10{font-size:40px;color:black;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .edge-depth-10{stroke-width:-16;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled circle,#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:lightgray;}#mermaid-svg-vKe5SzKkTQZEQau7 .disabled text{fill:#efefef;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-root rect,#mermaid-svg-vKe5SzKkTQZEQau7 .section-root path,#mermaid-svg-vKe5SzKkTQZEQau7 .section-root circle,#mermaid-svg-vKe5SzKkTQZEQau7 .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-vKe5SzKkTQZEQau7 .section-root text{fill:#ffffff;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-root span{color:#ffffff;}#mermaid-svg-vKe5SzKkTQZEQau7 .section-2 span{color:#ffffff;}#mermaid-svg-vKe5SzKkTQZEQau7 .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-vKe5SzKkTQZEQau7 .edge{fill:none;}#mermaid-svg-vKe5SzKkTQZEQau7 .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-vKe5SzKkTQZEQau7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 编译与调试
知识体系
编译阶段
编译流程与ELF格式(第1章)
GCC编译选项(第2章)
binutils构建工具(第3章)
二进制分析
ELF分析工具(第4章)
proc/sys接口(第15章)
调试阶段
GDB调试(第5章)
内存调试(第7章)
程序追踪(第8章)
日志分析(第12章)
性能分析
perf/gprof(第6章)
系统监控(第9章)
系统调优(第14章)
专项调试
网络调试(第10章)
文件系统分析(第11章)
内核调试(第13章)
辅助体系
辅助工具与方法论(第16章)
知识体系各模块之间的关系如下:
#mermaid-svg-eUZJf5Gpo9x3O7mC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-eUZJf5Gpo9x3O7mC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-eUZJf5Gpo9x3O7mC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-eUZJf5Gpo9x3O7mC .error-icon{fill:#552222;}#mermaid-svg-eUZJf5Gpo9x3O7mC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eUZJf5Gpo9x3O7mC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-eUZJf5Gpo9x3O7mC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eUZJf5Gpo9x3O7mC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eUZJf5Gpo9x3O7mC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-eUZJf5Gpo9x3O7mC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eUZJf5Gpo9x3O7mC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eUZJf5Gpo9x3O7mC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eUZJf5Gpo9x3O7mC .marker.cross{stroke:#333333;}#mermaid-svg-eUZJf5Gpo9x3O7mC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eUZJf5Gpo9x3O7mC p{margin:0;}#mermaid-svg-eUZJf5Gpo9x3O7mC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-eUZJf5Gpo9x3O7mC .cluster-label text{fill:#333;}#mermaid-svg-eUZJf5Gpo9x3O7mC .cluster-label span{color:#333;}#mermaid-svg-eUZJf5Gpo9x3O7mC .cluster-label span p{background-color:transparent;}#mermaid-svg-eUZJf5Gpo9x3O7mC .label text,#mermaid-svg-eUZJf5Gpo9x3O7mC span{fill:#333;color:#333;}#mermaid-svg-eUZJf5Gpo9x3O7mC .node rect,#mermaid-svg-eUZJf5Gpo9x3O7mC .node circle,#mermaid-svg-eUZJf5Gpo9x3O7mC .node ellipse,#mermaid-svg-eUZJf5Gpo9x3O7mC .node polygon,#mermaid-svg-eUZJf5Gpo9x3O7mC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eUZJf5Gpo9x3O7mC .rough-node .label text,#mermaid-svg-eUZJf5Gpo9x3O7mC .node .label text,#mermaid-svg-eUZJf5Gpo9x3O7mC .image-shape .label,#mermaid-svg-eUZJf5Gpo9x3O7mC .icon-shape .label{text-anchor:middle;}#mermaid-svg-eUZJf5Gpo9x3O7mC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-eUZJf5Gpo9x3O7mC .rough-node .label,#mermaid-svg-eUZJf5Gpo9x3O7mC .node .label,#mermaid-svg-eUZJf5Gpo9x3O7mC .image-shape .label,#mermaid-svg-eUZJf5Gpo9x3O7mC .icon-shape .label{text-align:center;}#mermaid-svg-eUZJf5Gpo9x3O7mC .node.clickable{cursor:pointer;}#mermaid-svg-eUZJf5Gpo9x3O7mC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-eUZJf5Gpo9x3O7mC .arrowheadPath{fill:#333333;}#mermaid-svg-eUZJf5Gpo9x3O7mC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eUZJf5Gpo9x3O7mC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eUZJf5Gpo9x3O7mC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eUZJf5Gpo9x3O7mC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-eUZJf5Gpo9x3O7mC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eUZJf5Gpo9x3O7mC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-eUZJf5Gpo9x3O7mC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eUZJf5Gpo9x3O7mC .cluster text{fill:#333;}#mermaid-svg-eUZJf5Gpo9x3O7mC .cluster span{color:#333;}#mermaid-svg-eUZJf5Gpo9x3O7mC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-eUZJf5Gpo9x3O7mC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-eUZJf5Gpo9x3O7mC rect.text{fill:none;stroke-width:0;}#mermaid-svg-eUZJf5Gpo9x3O7mC .icon-shape,#mermaid-svg-eUZJf5Gpo9x3O7mC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eUZJf5Gpo9x3O7mC .icon-shape p,#mermaid-svg-eUZJf5Gpo9x3O7mC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-eUZJf5Gpo9x3O7mC .icon-shape .label rect,#mermaid-svg-eUZJf5Gpo9x3O7mC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eUZJf5Gpo9x3O7mC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-eUZJf5Gpo9x3O7mC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-eUZJf5Gpo9x3O7mC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 专项层
系统层
诊断层
分析层
基础层
支撑层
第15章 proc/sys接口
第16章 辅助工具与方法论
第1章 编译流程与ELF
第2章 GCC选项
第3章 binutils工具
第4章 ELF分析工具
第5章 GDB调试
第7章 内存调试
第6章 性能分析
第8章 程序追踪
第9章 系统监控
第14章 系统调优
第13章 内核调试
第10章 网络调试
第11章 文件系统
第12章 日志分析
17.2 各章核心内容回顾
| 章节 | 主题 | 核心工具/知识点 | 解决的核心问题 |
|---|---|---|---|
| 第1章 | 编译流程与ELF文件格式 | gcc -E/-S/-c、ELF Header、Program Header、Section Header |
理解程序从源码到二进制的完整过程 |
| 第2章 | GCC编译选项详解 | -Wall、-O2、-g、-fsanitize、-fstack-protector |
控制编译行为、保障代码质量和安全 |
| 第3章 | 链接与库管理工具 | as、ld、objcopy、ar、ranlib、strip |
精细控制链接过程、管理静态库、生成发布版本 |
| 第4章 | ELF二进制分析工具 | file、ldd、objdump、readelf、size、strings、nm、addr2line、c++filt、elfedit |
在无源码情况下分析二进制文件 |
| 第5章 | GDB调试详解 | break、run、next、step、print、bt、watch、thread、attach |
源码级调试、定位逻辑错误和崩溃原因 |
| 第6章 | 性能分析工具 | perf stat/record/report/top/sched/lock/c2c、gprof、火焰图、PGO |
定位性能瓶颈、指导优化方向 |
| 第7章 | 内存调试工具 | Valgrind Memcheck/Cachegrind/Helgrind/Massif、ASan/TSan/UBSan、jhook | 检测内存泄漏、越界、数据竞争 |
| 第8章 | 程序追踪工具 | strace、ltrace、ftrace、bpftrace、trace-cmd、pstack |
追踪系统调用和内核行为、定位运行时问题 |
| 第9章 | 系统监控工具 | top、ps、vmstat、iostat、sar、mpstat、pidstat、dstat、lsof |
实时观测系统资源使用、定位瓶颈方向 |
| 第10章 | 网络调试工具 | tcpdump、ss、ping、mtr、iperf3、iftop、nethogs、ethtool |
排查网络连通性、延迟、丢包、带宽问题 |
| 第11章 | 文件系统分析工具 | df、du、stat、inotifywait、debugfs、mount、filefrag |
排查磁盘空间、文件访问、挂载问题 |
| 第12章 | 日志分析 | journalctl、dmesg、/var/log、rsyslog、logrotate、logger |
从日志中获取故障线索、追溯历史事件 |
| 第13章 | 内核调试配置 | CONFIG_KASAN、lockdep、ftrace、kdump、crash、SysRq |
内核级问题定位、崩溃分析 |
| 第14章 | 系统配置与调优 | ulimit、sysctl、I/O调度器、cpupower、taskset、chrt、numactl |
系统级性能调优、资源限制配置 |
| 第15章 | proc/sys文件系统接口速查 | /proc/cpuinfo、/proc/meminfo、/proc/<pid>/maps、/sys/block/ |
内核运行时信息获取、参数动态调整 |
| 第16章 | 辅助工具与调试方法论 | lshw、stress-ng、火焰图、set -x、time、watch、tmux |
硬件信息采集、压力测试、调试流程规范化 |
17.3 按问题域的工具选择速查表
面对实际问题时,可按照以下速查表快速选择合适的工具:
| 问题域 | 典型现象 | 首选工具 | 进阶工具 | 对应章节 |
|---|---|---|---|---|
| 编译错误 | 语法错误、链接错误、未定义符号 | gcc -Wall -Wextra、nm、ldd |
readelf -s、objdump -t、ld -Map |
第2、3、4章 |
| 程序崩溃 | Segfault、SIGABRT、coredump | gdb + coredump、dmesg、addr2line |
Valgrind、ASan、crash(内核) |
第5、7、12、13章 |
| 内存泄漏 | 内存持续增长、OOM | Valgrind Memcheck、ASan/LSan | jhook、Massif、pmap |
第7章 |
| 内存越界 | 堆栈破坏、随机崩溃 | ASan、Valgrind Memcheck | KASAN(内核) | 第7、13章 |
| 数据竞争 | 多线程行为不确定、偶发崩溃 | TSan、Helgrind → DRD确认 | perf lock、lockdep(内核) |
第7、13章 |
| CPU性能 | 响应慢、CPU占用高 | perf record + report、火焰图 |
gprof、perf top、perf stat -d |
第6章 |
| I/O性能 | 磁盘读写慢、await高 | iostat -x、iotop |
blktrace、fio、pidstat -d |
第9、14章 |
| 内存性能 | 频繁换页、cache miss高 | free、vmstat、/proc/meminfo |
perf stat -d、Cachegrind |
第6、9章 |
| 网络问题 | 连接超时、丢包、延迟高 | ping、mtr、ss、tcpdump |
iperf3、ethtool -S、dropwatch |
第10章 |
| 死锁/卡死 | 进程无响应、D状态 | pstack、gdb(thread apply all bt) |
/proc/<pid>/stack、ftrace、lockdep |
第5、8、13章 |
| 文件描述符耗尽 | Too many open files | lsof、/proc/<pid>/fd |
ulimit、limits.conf |
第9、14章 |
| 磁盘空间不足 | No space left on device | df -h、du -sh |
lsof(deleted文件)、df -i |
第11章 |
| 内核崩溃 | kernel panic、oops | dmesg、crash + vmcore |
kdump、SysRq、ftrace | 第13章 |
| 系统调优 | 整体性能不佳 | sysctl、ulimit、cpupower |
taskset、numactl、chrt、I/O调度器 |
第14章 |
17.4 调试方法论核心原则
贯穿全书的调试方法论可归纳为以下六条核心原则:
| 原则 | 说明 | 实践要点 |
|---|---|---|
| 先观测后修改 | 使用监控工具确认问题,再针对性修复 | 避免盲目修改代码,先用 top/perf/strace 确认瓶颈 |
| 从宏观到微观 | 先定位方向,再深入细节 | top/iostat 确定子系统 → perf/strace 定位函数/系统调用 |
| 一次只改一个变量 | 便于确认修复效果 | 每次修改后独立验证,避免多变量混淆 |
| 量化验证 | 修复后用基准测试验证性能提升 | sysbench/fio/iperf3 对比修改前后数据 |
| 复现优先 | 无法复现的问题先想办法复现 | 压力测试(stress-ng)、日志分析、coredump 回放 |
| 保留现场 | 保存调试现场以便事后分析 | script/tee 记录终端、coredump 保存崩溃快照、perf.data 保存采样 |
方法论实践要点详解:
| 原则 | 反面案例 | 正面做法 |
|---|---|---|
| 先观测后修改 | 看到程序慢就加缓存 | 先 perf record 确认热点函数,再针对性优化 |
| 从宏观到微观 | 直接 strace 追踪所有系统调用 |
先 top 确认是 CPU/IO/内存瓶颈,再选择对应工具 |
| 一次只改一个变量 | 同时修改算法和数据结构 | 先改算法验证效果,再改数据结构对比 |
| 量化验证 | "感觉快了很多" | time ./program 对比修改前后的具体数值 |
| 复现优先 | 偶发问题直接猜测原因 | 用 stress-ng 加压、分析日志规律、构造最小复现用例 |
| 保留现场 | 重启后丢失所有信息 | script 记录终端、coredumpctl 保存 coredump |
17.5 调试流程总览
以下决策图展示了面对不同类型问题时的完整调试路径:
#mermaid-svg-BzugabtpiEs3A1Of{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BzugabtpiEs3A1Of .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BzugabtpiEs3A1Of .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BzugabtpiEs3A1Of .error-icon{fill:#552222;}#mermaid-svg-BzugabtpiEs3A1Of .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BzugabtpiEs3A1Of .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BzugabtpiEs3A1Of .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BzugabtpiEs3A1Of .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BzugabtpiEs3A1Of .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BzugabtpiEs3A1Of .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BzugabtpiEs3A1Of .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BzugabtpiEs3A1Of .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BzugabtpiEs3A1Of .marker.cross{stroke:#333333;}#mermaid-svg-BzugabtpiEs3A1Of svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BzugabtpiEs3A1Of p{margin:0;}#mermaid-svg-BzugabtpiEs3A1Of .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BzugabtpiEs3A1Of .cluster-label text{fill:#333;}#mermaid-svg-BzugabtpiEs3A1Of .cluster-label span{color:#333;}#mermaid-svg-BzugabtpiEs3A1Of .cluster-label span p{background-color:transparent;}#mermaid-svg-BzugabtpiEs3A1Of .label text,#mermaid-svg-BzugabtpiEs3A1Of span{fill:#333;color:#333;}#mermaid-svg-BzugabtpiEs3A1Of .node rect,#mermaid-svg-BzugabtpiEs3A1Of .node circle,#mermaid-svg-BzugabtpiEs3A1Of .node ellipse,#mermaid-svg-BzugabtpiEs3A1Of .node polygon,#mermaid-svg-BzugabtpiEs3A1Of .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BzugabtpiEs3A1Of .rough-node .label text,#mermaid-svg-BzugabtpiEs3A1Of .node .label text,#mermaid-svg-BzugabtpiEs3A1Of .image-shape .label,#mermaid-svg-BzugabtpiEs3A1Of .icon-shape .label{text-anchor:middle;}#mermaid-svg-BzugabtpiEs3A1Of .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BzugabtpiEs3A1Of .rough-node .label,#mermaid-svg-BzugabtpiEs3A1Of .node .label,#mermaid-svg-BzugabtpiEs3A1Of .image-shape .label,#mermaid-svg-BzugabtpiEs3A1Of .icon-shape .label{text-align:center;}#mermaid-svg-BzugabtpiEs3A1Of .node.clickable{cursor:pointer;}#mermaid-svg-BzugabtpiEs3A1Of .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BzugabtpiEs3A1Of .arrowheadPath{fill:#333333;}#mermaid-svg-BzugabtpiEs3A1Of .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BzugabtpiEs3A1Of .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BzugabtpiEs3A1Of .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BzugabtpiEs3A1Of .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BzugabtpiEs3A1Of .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BzugabtpiEs3A1Of .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BzugabtpiEs3A1Of .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BzugabtpiEs3A1Of .cluster text{fill:#333;}#mermaid-svg-BzugabtpiEs3A1Of .cluster span{color:#333;}#mermaid-svg-BzugabtpiEs3A1Of div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BzugabtpiEs3A1Of .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BzugabtpiEs3A1Of rect.text{fill:none;stroke-width:0;}#mermaid-svg-BzugabtpiEs3A1Of .icon-shape,#mermaid-svg-BzugabtpiEs3A1Of .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BzugabtpiEs3A1Of .icon-shape p,#mermaid-svg-BzugabtpiEs3A1Of .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BzugabtpiEs3A1Of .icon-shape .label rect,#mermaid-svg-BzugabtpiEs3A1Of .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BzugabtpiEs3A1Of .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BzugabtpiEs3A1Of .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BzugabtpiEs3A1Of :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 程序崩溃
性能下降
内存异常
死锁/卡死
I/O缓慢
网络异常
内核问题
能
不能
发现问题
问题类型?
崩溃调试流程
性能分析流程
内存分析流程
死锁分析流程
I/O分析流程
网络分析流程
内核分析流程
dmesg 获取出错信息
addr2line 定位源码
gdb 加载 coredump
bt 查看堆栈 / 检查变量
top/mpstat 确认 CPU 瓶颈
perf record 采样
perf report / 火焰图
优化热点函数
能否重编译?
ASan/LSan 检测
Valgrind Memcheck
分析错误报告
pstack/gdb 查看堆栈
perf lock 分析
Helgrind/TSan 检测
iotop 定位进程
iostat 查看设备
blktrace 详细追踪
fio 基准测试
ping/mtr 连通性
ss/netstat 连接状态
tcpdump 抓包
Wireshark 分析
dmesg -T -w
ftrace/bpftrace 追踪
crash 分析 vmcore
各流程的关键步骤速查:
| 问题类型 | 第一步(确认方向) | 第二步(定位细节) | 第三步(验证修复) |
|---|---|---|---|
| 程序崩溃 | `dmesg | grep segfault` | gdb ./prog core → bt |
| CPU性能 | top 确认 %us/%sy 高 |
perf record -g → 火焰图 |
perf stat 对比优化前后 |
| 内存泄漏 | free -h 观察趋势 |
ASan/Valgrind 定位分配点 | 修复后 pmap 确认内存稳定 |
| 死锁 | pstack <PID> 多次采样 |
gdb -p <PID> → thread apply all bt |
TSan 验证无竞争 |
| I/O缓慢 | iotop 定位高I/O进程 |
iostat -x 1 确认设备瓶颈 |
fio 基准测试对比 |
| 网络异常 | ping -c 4 + mtr |
tcpdump 抓包分析 |
iperf3 验证带宽恢复 |
| 内核问题 | dmesg -T 查看错误 |
ftrace/bpftrace 追踪 |
修复后压力测试验证稳定性 |
17.6 工具全景速查总表
以下按功能类别汇总全书涉及的所有核心工具,共计 100+ 个工具/命令:
17.6.1 编译构建工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 编译器 | gcc/g++ |
C/C++ 编译 | gcc -O2 -g -Wall -o prog prog.c |
第1、2章 |
| 汇编器 | as |
汇编代码→目标文件 | as -o out.o in.s |
第3章 |
| 链接器 | ld |
目标文件→可执行文件/库 | ld -o prog a.o b.o -lc |
第3章 |
| 库管理 | ar |
创建/管理静态库 | ar rcs libxx.a a.o b.o |
第3章 |
| 索引 | ranlib |
更新静态库索引 | ranlib libxx.a |
第3章 |
| 段编辑 | objcopy |
格式转换、段操作 | objcopy -O binary in.elf out.bin |
第3章 |
| 符号剥离 | strip |
去除符号/调试信息 | strip -o prog.stripped prog |
第3章 |
17.6.2 二进制分析工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 文件探测 | file |
探测文件类型 | file program |
第4章 |
| 依赖查看 | ldd |
查看动态库依赖 | ldd program |
第4章 |
| 反汇编 | objdump |
反汇编、查看节信息 | objdump -d program |
第4章 |
| ELF分析 | readelf |
查看ELF结构信息 | readelf -a program |
第4章 |
| ELF编辑 | elfedit |
编辑ELF文件头字段 | elfedit --output-osabi=Linux prog |
第4章 |
| 段大小 | size |
查看text/data/bss大小 | size program |
第4章 |
| 字符串 | strings |
提取可打印字符串 | strings program |
第4章 |
| 符号表 | nm |
查看符号表 | nm -C program |
第4章 |
| 地址转换 | addr2line |
地址→文件名:行号 | addr2line -e prog 0x400b80 |
第4章 |
| 符号解码 | c++filt |
C++符号名解码 | c++filt _ZNKSt8ios_base6flagsEv |
第4章 |
17.6.3 调试与检测工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 调试器 | gdb |
源码级调试 | gdb ./program core |
第5章 |
| coredump管理 | coredumpctl |
systemd coredump管理 | coredumpctl -1 gdb |
第5、16章 |
| 性能采样 | perf |
硬件性能计数器采样 | perf record -F 99 -g ./program |
第6章 |
| 性能剖析 | gprof |
函数调用分析 | gprof program gmon.out |
第6章 |
| 内存检测 | Valgrind | 动态二进制翻译检测 | valgrind --leak-check=full ./prog |
第7章 |
| 轻量内存检测 | jhook | LD_PRELOAD内存监控 | LD_PRELOAD=libjtreehook.so ./prog |
第7章 |
| 编译插桩 | ASan/TSan/UBSan | 运行时内存/线程/未定义行为检测 | gcc -fsanitize=address |
第7章 |
| 系统调用追踪 | strace |
追踪系统调用 | strace -f -e trace=%file -p PID |
第8章 |
| 库函数追踪 | ltrace |
追踪库函数调用 | ltrace -p PID |
第8章 |
| 内核追踪 | ftrace | 内核函数追踪 | echo function > current_tracer |
第8章 |
| eBPF追踪 | bpftrace |
eBPF追踪语言 | bpftrace -e 'kprobe:do_sys_open {printf(...)}' |
第8章 |
| ftrace前端 | trace-cmd |
ftrace命令行封装 | trace-cmd record -e sched_switch sleep 10 |
第8章 |
| 调用栈查看 | pstack |
打印进程调用栈 | pstack <PID> |
第8章 |
| 用户函数追踪 | uftrace |
用户态函数级追踪 | uftrace record ./program |
第8章 |
| 内核崩溃分析 | crash |
vmcore分析 | crash vmlinux vmcore |
第13章 |
17.6.4 系统监控工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 进程监控 | top/htop |
实时进程监控 | top -H -p PID |
第9章 |
| 进程快照 | ps |
进程状态查看 | ps aux --sort=-%cpu |
第9章 |
| 进程树 | pstree |
树形显示进程关系 | pstree -p |
第9章 |
| 虚拟内存 | vmstat |
虚拟内存统计 | vmstat 1 5 |
第9章 |
| 磁盘I/O | iostat |
磁盘I/O统计 | iostat -x 1 |
第9章 |
| 进程I/O | iotop |
进程I/O监控 | sudo iotop -o |
第9章 |
| 综合报告 | sar |
系统活动报告 | sar -u -f /var/log/sa/sa15 |
第9章 |
| 多核CPU | mpstat |
多核CPU统计 | mpstat -P ALL 1 |
第9章 |
| 进程统计 | pidstat |
进程资源统计 | pidstat -d -p PID 1 |
第9章 |
| 综合监控 | dstat |
综合资源统计 | dstat -cdngy 1 |
第9章 |
| 内存概览 | free |
内存使用概览 | free -h |
第9章 |
| 进程内存 | pmap |
进程内存映射 | pmap -x PID |
第9章 |
| 文件描述符 | lsof |
查看打开的文件/连接 | lsof -i :80 |
第9章 |
17.6.5 网络调试工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 抓包 | tcpdump |
命令行抓包 | tcpdump -nni eth0 'port 80' -w cap.pcap |
第10章 |
| 连接状态 | ss |
socket状态查看 | ss -tunap |
第10章 |
| 连通性 | ping |
连通性和延迟 | ping -c 4 host |
第10章 |
| 路由跟踪 | mtr |
持续路由监控 | mtr -r -c 100 host |
第10章 |
| 路由跟踪 | traceroute |
逐跳路由追踪 | traceroute host |
第10章 |
| 带宽测试 | iperf3 |
网络带宽测试 | iperf3 -c server -t 30 |
第10章 |
| 流量监控 | iftop/nethogs |
连接/进程级带宽 | iftop -i eth0 |
第10章 |
| 网卡信息 | ethtool |
网卡参数与统计 | ethtool -S eth0 |
第10章 |
| DNS查询 | dig/nslookup |
DNS解析查询 | dig example.com |
第10章 |
| 协议分析 | Wireshark | 图形化抓包分析 | wireshark cap.pcap |
第10章 |
| 丢包定位 | dropwatch |
内核丢包定位 | dropwatch |
第10章 |
17.6.6 文件系统工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 磁盘空间 | df/du |
文件系统/目录空间 | df -h、du -sh * |
第11章 |
| 文件属性 | stat |
文件详细属性 | stat file |
第11章 |
| 文件事件 | inotifywait |
文件系统事件监控 | inotifywait -mr /dir/ |
第11章 |
| 文件事件统计 | inotifywatch |
文件事件统计 | inotifywatch -mr /dir/ |
第11章 |
| 文件系统调试 | debugfs |
ext文件系统底层调试 | sudo debugfs /dev/sda1 |
第11章 |
| 挂载管理 | mount/umount |
文件系统挂载/卸载 | mount -t ext4 /dev/sdb1 /mnt |
第11章 |
| 挂载查询 | findmnt |
查询挂载信息 | findmnt -T /home |
第11章 |
| 碎片分析 | filefrag |
文件碎片分析 | filefrag -v file |
第11章 |
| I/O追踪 | blktrace |
块设备I/O追踪 | blktrace -d /dev/sda |
第14章 |
17.6.7 日志分析工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 日志查询 | journalctl |
systemd日志查询 | journalctl -u nginx --since today |
第12章 |
| 内核日志 | dmesg |
内核环形缓冲区 | dmesg -T -w |
第12章 |
| 日志服务 | rsyslog | 传统日志服务 | rsyslogd -N1 |
第12章 |
| 日志轮转 | logrotate |
日志轮转管理 | logrotate -f /etc/logrotate.conf |
第12章 |
| 日志写入 | logger |
手动写入系统日志 | logger -t myapp -p local0.info "msg" |
第12章 |
17.6.8 内核调试与系统调优工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 内核参数 | sysctl |
内核参数查看/设置 | sysctl -w vm.swappiness=10 |
第14章 |
| 资源限制 | ulimit |
shell资源限制 | ulimit -n 65536 |
第14章 |
| CPU频率 | cpupower |
CPU频率管理 | cpupower frequency-set -g performance |
第14章 |
| CPU绑定 | taskset |
CPU亲和性设置 | taskset -c 0-3 ./program |
第14章 |
| 调度策略 | chrt |
进程调度策略 | chrt -f 99 ./program |
第14章 |
| NUMA控制 | numactl |
NUMA亲和性控制 | numactl --cpunodebind=0 ./program |
第14章 |
| 内核内存检测 | KASAN | 内核地址消毒器 | 内核编译选项 CONFIG_KASAN=y |
第13章 |
| 锁检测 | lockdep | 内核锁依赖检测 | 内核编译选项 CONFIG_PROVE_LOCKING=y |
第13章 |
| 崩溃转储 | kdump | 内核崩溃转储服务 | systemctl enable kdump |
第13章 |
| 紧急调试 | SysRq | 内核紧急调试接口 | echo t > /proc/sysrq-trigger |
第13章 |
17.6.9 压力测试与基准工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 系统压力 | stress-ng |
系统压力测试 | stress-ng --cpu 8 --timeout 60s |
第16章 |
| I/O基准 | fio |
I/O基准测试 | fio --rw=randwrite --bs=4k |
第16章 |
| CPU基准 | sysbench |
CPU/内存基准 | sysbench cpu run |
第16章 |
| I/O延迟 | ioping |
I/O延迟测试 | ioping -c 10 /data |
第16章 |
| 底层延迟 | lmbench |
底层延迟基准 | lat_proc fork / lat_ctx 4 |
第16章 |
17.6.10 硬件信息与辅助工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 硬件概览 | lshw |
全部硬件概览 | sudo lshw -short |
第16章 |
| CPU信息 | lscpu |
CPU架构与拓扑 | lscpu -e |
第16章 |
| 块设备 | lsblk |
块设备与分区 | lsblk -f |
第16章 |
| PCI设备 | lspci |
PCI设备信息 | lspci -k |
第16章 |
| USB设备 | lsusb |
USB设备信息 | lsusb -t |
第16章 |
| BIOS信息 | dmidecode |
BIOS/内存条信息 | sudo dmidecode -t memory |
第16章 |
| 磁盘健康 | smartctl |
磁盘健康检查 | sudo smartctl -H /dev/sda |
第16章 |
| 时间测量 | time |
命令执行时间 | time ./program |
第16章 |
| 定期刷新 | watch |
定期刷新命令输出 | watch -n 1 "free -m" |
第16章 |
| 终端复用 | tmux |
终端复用与会话管理 | tmux new -s debug |
第16章 |
| 会话记录 | script/scriptreplay |
终端会话记录/回放 | script --timing=t.log s.log |
第16章 |
| 输出保存 | tee |
同时输出到终端和文件 | `cmd | tee out.log` |
17.6.11 可视化与Shell调试工具
| 类别 | 工具 | 一句话功能 | 典型命令 | 对应章节 |
|---|---|---|---|---|
| 火焰图 | FlameGraph | CPU/内存火焰图 | `perf script | stackcollapse |
| perf可视化 | hotspot | 图形化perf分析 | hotspot perf.data |
第16章 |
| ftrace可视化 | kernelshark | ftrace图形化查看 | kernelshark trace.dat |
第8、16章 |
| 命令追踪 | set -x |
打印执行的命令 | 脚本开头或 bash -x |
第16章 |
| 严格模式 | set -euo pipefail |
Shell严格模式 | 脚本开头 | 第16章 |
| 信号清理 | trap |
信号处理与清理 | trap "rm -f $TMP" EXIT |
第16章 |
17.7 学习路径建议
根据读者的不同目标和基础,建议以下学习路径:
#mermaid-svg-GjzYxlYX3hTlLGqS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GjzYxlYX3hTlLGqS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GjzYxlYX3hTlLGqS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GjzYxlYX3hTlLGqS .error-icon{fill:#552222;}#mermaid-svg-GjzYxlYX3hTlLGqS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GjzYxlYX3hTlLGqS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GjzYxlYX3hTlLGqS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GjzYxlYX3hTlLGqS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GjzYxlYX3hTlLGqS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GjzYxlYX3hTlLGqS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GjzYxlYX3hTlLGqS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GjzYxlYX3hTlLGqS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GjzYxlYX3hTlLGqS .marker.cross{stroke:#333333;}#mermaid-svg-GjzYxlYX3hTlLGqS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GjzYxlYX3hTlLGqS p{margin:0;}#mermaid-svg-GjzYxlYX3hTlLGqS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GjzYxlYX3hTlLGqS .cluster-label text{fill:#333;}#mermaid-svg-GjzYxlYX3hTlLGqS .cluster-label span{color:#333;}#mermaid-svg-GjzYxlYX3hTlLGqS .cluster-label span p{background-color:transparent;}#mermaid-svg-GjzYxlYX3hTlLGqS .label text,#mermaid-svg-GjzYxlYX3hTlLGqS span{fill:#333;color:#333;}#mermaid-svg-GjzYxlYX3hTlLGqS .node rect,#mermaid-svg-GjzYxlYX3hTlLGqS .node circle,#mermaid-svg-GjzYxlYX3hTlLGqS .node ellipse,#mermaid-svg-GjzYxlYX3hTlLGqS .node polygon,#mermaid-svg-GjzYxlYX3hTlLGqS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GjzYxlYX3hTlLGqS .rough-node .label text,#mermaid-svg-GjzYxlYX3hTlLGqS .node .label text,#mermaid-svg-GjzYxlYX3hTlLGqS .image-shape .label,#mermaid-svg-GjzYxlYX3hTlLGqS .icon-shape .label{text-anchor:middle;}#mermaid-svg-GjzYxlYX3hTlLGqS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GjzYxlYX3hTlLGqS .rough-node .label,#mermaid-svg-GjzYxlYX3hTlLGqS .node .label,#mermaid-svg-GjzYxlYX3hTlLGqS .image-shape .label,#mermaid-svg-GjzYxlYX3hTlLGqS .icon-shape .label{text-align:center;}#mermaid-svg-GjzYxlYX3hTlLGqS .node.clickable{cursor:pointer;}#mermaid-svg-GjzYxlYX3hTlLGqS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GjzYxlYX3hTlLGqS .arrowheadPath{fill:#333333;}#mermaid-svg-GjzYxlYX3hTlLGqS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GjzYxlYX3hTlLGqS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GjzYxlYX3hTlLGqS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GjzYxlYX3hTlLGqS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GjzYxlYX3hTlLGqS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GjzYxlYX3hTlLGqS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GjzYxlYX3hTlLGqS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GjzYxlYX3hTlLGqS .cluster text{fill:#333;}#mermaid-svg-GjzYxlYX3hTlLGqS .cluster span{color:#333;}#mermaid-svg-GjzYxlYX3hTlLGqS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GjzYxlYX3hTlLGqS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GjzYxlYX3hTlLGqS rect.text{fill:none;stroke-width:0;}#mermaid-svg-GjzYxlYX3hTlLGqS .icon-shape,#mermaid-svg-GjzYxlYX3hTlLGqS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GjzYxlYX3hTlLGqS .icon-shape p,#mermaid-svg-GjzYxlYX3hTlLGqS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GjzYxlYX3hTlLGqS .icon-shape .label rect,#mermaid-svg-GjzYxlYX3hTlLGqS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GjzYxlYX3hTlLGqS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GjzYxlYX3hTlLGqS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GjzYxlYX3hTlLGqS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 高级路径
第13章 内核调试
第14章 系统调优
第15章 proc/sys接口
第16章 方法论
进阶路径
第4章 ELF分析
第7章 内存调试
第6章 性能分析
第8章 程序追踪
入门路径
第1章 编译流程
第2章 GCC选项
第5章 GDB基础
第9章 系统监控
17.7.1 按读者类型推荐
| 读者类型 | 建议重点章节 | 学习目标 |
|---|---|---|
| 嵌入式开发新手 | 第1、2、3、5章 | 掌握编译流程和基本调试能力 |
| 应用开发工程师 | 第5、6、7、8、9章 | 具备性能优化和内存调试能力 |
| 系统/内核开发者 | 第8、13、14、15章 | 掌握内核级调试和系统调优 |
| 运维/SRE | 第9、10、11、12、14、16章 | 具备系统监控和故障排查能力 |
| 安全工程师 | 第2、4、7章 | 掌握安全编译选项和二进制分析 |
17.7.2 各路径核心技能矩阵
| 路径 | 阶段 | 核心技能 | 验证标准 |
|---|---|---|---|
| 入门 | 第1阶段 | 理解编译四阶段、ELF基本结构 | 能解释 .o → 可执行文件的过程 |
| 入门 | 第2阶段 | 掌握 GCC 常用选项、警告配置 | 能编写规范的 Makefile 编译选项 |
| 入门 | 第3阶段 | GDB 断点、单步、查看变量 | 能独立定位段错误原因 |
| 入门 | 第4阶段 | top/ps/vmstat 基本使用 |
能判断系统瓶颈方向 |
| 进阶 | 第5阶段 | readelf/objdump/nm 分析二进制 |
能分析无源码的二进制文件 |
| 进阶 | 第6阶段 | Valgrind/ASan 检测内存问题 | 能定位内存泄漏和越界 |
| 进阶 | 第7阶段 | perf record/火焰图分析热点 |
能定位 CPU 性能瓶颈 |
| 进阶 | 第8阶段 | strace/ftrace 追踪运行时行为 |
能追踪系统调用和内核行为 |
| 高级 | 第9阶段 | kdump/crash 分析内核崩溃 | 能分析 vmcore 定位内核 bug |
| 高级 | 第10阶段 | sysctl/taskset/numactl 系统调优 | 能完成生产环境性能调优 |
| 高级 | 第11阶段 | proc/sys 接口深入使用 | 能动态获取和修改内核参数 |
| 高级 | 第12阶段 | 形成系统化调试方法论 | 能高效处理复杂生产问题 |
17.8 本章小结
本书从编译流程出发,经过二进制分析、源码调试、性能剖析、内存检测、系统追踪、资源监控、网络诊断、文件系统分析、日志排查、内核调试、系统调优,最终形成了一套完整的 Linux C/C++ 程序编译与调试知识体系。核心要点如下:
| 序号 | 核心要点 | 说明 |
|---|---|---|
| 1 | 编译是调试的基础 | 理解编译四阶段、ELF 格式和链接过程,是分析二进制行为的前提 |
| 2 | 工具选择取决于问题类型 | 没有万能工具,根据问题域选择最合适的工具组合是高效调试的关键 |
| 3 | 从宏观到微观 | 先用 top/iostat 等工具确定瓶颈方向,再用 perf/strace/gdb 深入细节 |
| 4 | 量化驱动优化 | 任何调优都必须有基准测试数据支撑,避免凭感觉优化 |
| 5 | 保留现场是习惯 | coredump、perf.data、日志文件是事后分析的宝贵资源 |
| 6 | 持续实践是王道 | 工具的价值在于反复使用中形成的直觉,建议读者在实际项目中不断练习 |
全书工具使用频率与重要性矩阵:
#mermaid-svg-wca3wg9otitjGsY8{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wca3wg9otitjGsY8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wca3wg9otitjGsY8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wca3wg9otitjGsY8 .error-icon{fill:#552222;}#mermaid-svg-wca3wg9otitjGsY8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wca3wg9otitjGsY8 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wca3wg9otitjGsY8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wca3wg9otitjGsY8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wca3wg9otitjGsY8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wca3wg9otitjGsY8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wca3wg9otitjGsY8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wca3wg9otitjGsY8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wca3wg9otitjGsY8 .marker.cross{stroke:#333333;}#mermaid-svg-wca3wg9otitjGsY8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wca3wg9otitjGsY8 p{margin:0;}#mermaid-svg-wca3wg9otitjGsY8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 核心必备 专项深入 了解即可 日常辅助 ftrace crash iostat tcpdump objdump readelf gcc Valgrind strace top perf gdb 使用频率低 使用频率高 重要性低 重要性高 工具使用频率与重要性
最后,以一张总结图概括全书的知识脉络:
#mermaid-svg-dQR7SqvkHhm3Y1aP{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dQR7SqvkHhm3Y1aP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dQR7SqvkHhm3Y1aP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dQR7SqvkHhm3Y1aP .error-icon{fill:#552222;}#mermaid-svg-dQR7SqvkHhm3Y1aP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dQR7SqvkHhm3Y1aP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dQR7SqvkHhm3Y1aP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dQR7SqvkHhm3Y1aP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dQR7SqvkHhm3Y1aP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dQR7SqvkHhm3Y1aP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dQR7SqvkHhm3Y1aP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dQR7SqvkHhm3Y1aP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dQR7SqvkHhm3Y1aP .marker.cross{stroke:#333333;}#mermaid-svg-dQR7SqvkHhm3Y1aP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dQR7SqvkHhm3Y1aP p{margin:0;}#mermaid-svg-dQR7SqvkHhm3Y1aP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dQR7SqvkHhm3Y1aP .cluster-label text{fill:#333;}#mermaid-svg-dQR7SqvkHhm3Y1aP .cluster-label span{color:#333;}#mermaid-svg-dQR7SqvkHhm3Y1aP .cluster-label span p{background-color:transparent;}#mermaid-svg-dQR7SqvkHhm3Y1aP .label text,#mermaid-svg-dQR7SqvkHhm3Y1aP span{fill:#333;color:#333;}#mermaid-svg-dQR7SqvkHhm3Y1aP .node rect,#mermaid-svg-dQR7SqvkHhm3Y1aP .node circle,#mermaid-svg-dQR7SqvkHhm3Y1aP .node ellipse,#mermaid-svg-dQR7SqvkHhm3Y1aP .node polygon,#mermaid-svg-dQR7SqvkHhm3Y1aP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dQR7SqvkHhm3Y1aP .rough-node .label text,#mermaid-svg-dQR7SqvkHhm3Y1aP .node .label text,#mermaid-svg-dQR7SqvkHhm3Y1aP .image-shape .label,#mermaid-svg-dQR7SqvkHhm3Y1aP .icon-shape .label{text-anchor:middle;}#mermaid-svg-dQR7SqvkHhm3Y1aP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dQR7SqvkHhm3Y1aP .rough-node .label,#mermaid-svg-dQR7SqvkHhm3Y1aP .node .label,#mermaid-svg-dQR7SqvkHhm3Y1aP .image-shape .label,#mermaid-svg-dQR7SqvkHhm3Y1aP .icon-shape .label{text-align:center;}#mermaid-svg-dQR7SqvkHhm3Y1aP .node.clickable{cursor:pointer;}#mermaid-svg-dQR7SqvkHhm3Y1aP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dQR7SqvkHhm3Y1aP .arrowheadPath{fill:#333333;}#mermaid-svg-dQR7SqvkHhm3Y1aP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dQR7SqvkHhm3Y1aP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dQR7SqvkHhm3Y1aP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dQR7SqvkHhm3Y1aP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dQR7SqvkHhm3Y1aP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dQR7SqvkHhm3Y1aP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dQR7SqvkHhm3Y1aP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dQR7SqvkHhm3Y1aP .cluster text{fill:#333;}#mermaid-svg-dQR7SqvkHhm3Y1aP .cluster span{color:#333;}#mermaid-svg-dQR7SqvkHhm3Y1aP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dQR7SqvkHhm3Y1aP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dQR7SqvkHhm3Y1aP rect.text{fill:none;stroke-width:0;}#mermaid-svg-dQR7SqvkHhm3Y1aP .icon-shape,#mermaid-svg-dQR7SqvkHhm3Y1aP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dQR7SqvkHhm3Y1aP .icon-shape p,#mermaid-svg-dQR7SqvkHhm3Y1aP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dQR7SqvkHhm3Y1aP .icon-shape .label rect,#mermaid-svg-dQR7SqvkHhm3Y1aP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dQR7SqvkHhm3Y1aP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dQR7SqvkHhm3Y1aP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dQR7SqvkHhm3Y1aP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 系统阶段(第9-16章)
诊断阶段(第6-8章)
分析阶段(第4-5章)
编译阶段(第1-3章)
源代码
预处理
编译
汇编
链接
ELF文件
二进制分析
file/readelf/objdump/nm
GDB调试
断点/单步/变量/堆栈
性能分析
perf/gprof/火焰图
内存调试
Valgrind/ASan/jhook
程序追踪
strace/ftrace/bpftrace
系统监控
top/vmstat/iostat
网络调试
tcpdump/ss/mtr
文件系统
df/du/inotifywait
日志分析
journalctl/dmesg
内核调试
crash/ftrace/SysRq
系统调优
sysctl/taskset/chrt