Linux
Linux software install
Google repo的使用
Vector AP StartApplication编译脚本解析
Yocto的cmake版本升级
不能自动安装的解决方式
S32G-BSP35.0-SDK使用方法
S32G从SDK生成文件系统的制作过程
Linux Samba设置
Linux添加双网卡
S32G USB-Redirector安装指南
VS code自动生成Doxygen格式注释
Linux下使用多线程下载
使用pandoc 生成带中文的pdf
minicom无法输入的问题解决办法
使用 systemd unit 添加一条路由规则
CMake 教程
步骤 1:基本起点
步骤 2:添加lib库
步骤 3:为库添加使用要求
步骤 4:添加生成器表达式
步骤 5:安装和测试
步骤 6:添加支持测试仪表板
步骤 7: 添加系统内省
步骤 8:自定义命令和生成的文
步骤 9:打包安装程序
步骤 10:选择静态库或共享库
步骤 11:添加导出配置
步骤 12:打包 Debug 和 Release
添加虚拟网卡
Vector AP 去掉防篡改校验
Vector AP startapplication编译与使用
Vector AP问题汇总
Vector AP大型项目开发流程
Vector AP EM
Vector AP 最简单的开发示例
Linux kernel 版本降级
Vector AP StartApplicaiton
startappplication-machine-design
startapplicaiton-machine-integration
amsr-vector-fs-em-executionmanager-design
amsr-vector-fs-em-executionmanager
Vector AP 复杂模型的开发
第一章 Machine和MachineDesign
第二章 Execute Manager
第三章 Log
第四章 State Manager
第五章 State Manager 源码的理解
第六章 Someip daemon
第七章 IPC Service Discovery Daemon
crond的使用方法
解决蓝牙鼠标在 Ubuntu 中单位时间内断开的问题
VPS服务器自建教程
v2rayA的客户端使用配置
GDB调试指南入门篇:揭开程序运行世界的神秘面纱
GDB调试指南高级篇:成为调试专家,掌控程序的命运
Linux安装PyQt5并配置Qt Designer
ADB 命令大全
GoogleTest(一)
GoogleTest(二)简单的TEST宏
GoogleTest(三)简单类函数测试
C++ Template
1. 函数模板
2. 类模板
3. 非类型模板参数
软件版本号规范
EPOLL
C++手札
C++ 使用{}初始化有哪些好处?
现代 C++ decltype 深入解析
函数对象(functor)
Linux性能剖析:CPU、内存、网络与I/O压力测试
AP StateManager
C++ Lambda表达式
C++ 中的Lambda表达式
Lambda 表达式语法
Lambda 表达式的示例
手动发送UDP数据包
pyqt5生成的UI界面不能输入中文
自己搭建repo镜像
摄影
Sony仿富士PP值设置
诗词歌赋
本文档使用 MrDoc 发布
-
+
首页
GDB调试指南入门篇:揭开程序运行世界的神秘面纱
# GDB调试指南入门篇:揭开程序运行世界的神秘面纱 在这篇文章中,你可以学习到以下内容: - GDB 的基础知识和背景。 - 如何安装和设置 GDB。 - GDB 的基本命令和用法,包括如何启动一个程序、设置断点、查看程序状态、单步执行和调试简单的程序错误。 - 简单的调试示例,比如修复一个段错误或内存泄漏。 ## **引言** GDB,GNU Debugger的简称,作为开源世界的调试神器,它在Linux、Unix以及Windows(通过诸如Cygwin等环境)平台上,为C、C++及多种现代编程语言的开发者提供了一个功能全面、深度互动的调试平台。GDB不仅仅是一款工具,它是开发者深入理解程序执行流程、识别并解决复杂问题的伙伴。本文档旨在引领您超越GDB的基础应用,深入其核心特性与高级实践,助您在调试的征途中,以更为精湛的技艺,洞察代码的微妙与复杂。 ## **安装GDB** ### **Linux/MacOS** 在大多数Linux发行版和MacOS中,GDB可以通过包管理器轻松安装。例如,在Ubuntu系统中,可以使用以下命令安装GDB: ```shell sudo apt-get install gdb ```  在MacOS上,如果已经安装了Homebrew,可以通过以下命令安装: ```auto brew install gdb ``` ### **Windows** Windows用户可以通过MinGW或MSYS2来获取GDB。安装完成后,确保将GDB的路径添加到系统的PATH环境变量中。 ## **示例代码** 示例代码引入一个内存访问错误 —— 对空指针的解引用。这种错误类型经常导致程序崩溃并生成核心转储(core dump),是使用GDB进行调试的一个常见场景。 ```c #include <stdio.h> int addNumbers(int* a, int* b) { // 在此错误地解引用传入指针 // 未检查指针是否为NULL,如果是NULL,解引用将导致段错误 return *a + *b; } int main(){ int number1, number2, sum; int *ptr1 = NULL; // 故意设置为NULL,模拟错误的指针使用 int *ptr2 = &number2; printf("请输入两个整数:"); scanf("%d %d", &number1, &number2); // 传入一个空指针和一个有效指针,这会引起运行时错误 sum = addNumbers(ptr1, ptr2); printf("两个数的和为:%d\n", sum); return 0; } ``` 在这个代码中,addNumbers函数预期接收两个整数指针,但main函数中故意将ptr1设置为NULL,而这将导致在尝试解引用NULL指针时发生运行时错误(通常是段错误)。 ## **GDB基本使用** ### **编译配置以支持调试信息** 开始之前,确保您的代码在编译时包含了必要的调试信息。使用GCC或G++时,添加选项是关键: ```shell gcc -g add_numbers.c -o add_numbers ``` ### **查看详细编译过程** ```shell gcc -g add_numbers.c -o add_numbers -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none:hsa OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) COLLECT_GCC_OPTIONS='-g' '-o' 'add_numbers' '-v' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/9/cc1 -quiet -v -imultiarch x86_64-linux-gnu add_numbers.c -quiet -dumpbase add_numbers.c -mtune=generic -march=x86-64 -auxbase add_numbers -g -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccGqEgGC.s GNU C17 (Ubuntu 9.4.0-1ubuntu1~20.04.2) version 9.4.0 (x86_64-linux-gnu) compiled by GNU C version 9.4.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/x86_64-linux-gnu/9/include /usr/local/include /usr/include/x86_64-linux-gnu /usr/include End of search list. GNU C17 (Ubuntu 9.4.0-1ubuntu1~20.04.2) version 9.4.0 (x86_64-linux-gnu) compiled by GNU C version 9.4.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 01da938ff5dc2163489aa33cb3b747a7 COLLECT_GCC_OPTIONS='-g' '-o' 'add_numbers' '-v' '-mtune=generic' '-march=x86-64' as -v --64 -o /tmp/ccRmDCPD.o /tmp/ccGqEgGC.s GNU assembler version 2.34 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.34 COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-g' '-o' 'add_numbers' '-v' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/cc2dZD1E.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o add_numbers /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. /tmp/ccRmDCPD.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o COLLECT_GCC_OPTIONS='-g' '-o' 'add_numbers' '-v' '-mtune=generic' '-march=x86-64' ``` ### **启动GDB** 打开终端,你可以用GDB调试这个程序,观察它在何处以及如何失败: ```shell gdb ./add_numbers ```  ### **设置断点** 在程序的某一行设置断点,当程序执行到这一行时会暂停,允许你查看和修改程序状态。设置断点的命令为break或简写b,后面跟上函数名或行号,例如: ```auto break main ```  或 ```shell break 9 break 11 ``` ### **运行程序** 使用run或r命令开始运行程序。如果设置了断点,程序会在到达第一个断点时暂停。  ### **单步执行** - next 或 n :执行下一行代码,如果当前行是一个函数调用,则不会进入该函数内部。 - step 或 s:执行下一行代码或进入函数内部。  ### **继续执行** 当程序暂停后,可以使用 continue 或 c 命令继续执行,直到遇到下一个断点。  ### **查看变量和表达式** 在程序暂停时,可以使用 print 或 p 命令查看变量值或计算表达式,如: ```shell print number1 ```  或 ```shell p number1 + number2 ```  ### **发现 segmentation fault 并修复**  ## **结语** 进入程序的运行世界,参透其内部逻辑机制,是一项既富有挑战又充满成就感的技能。GDB为你提供了一套强大的工具,帮你更好地理解程序是如何执行的——而这也是一位优秀的软件工程师所必备的能力。通过熟悉GDB,你将能够揭开程序的神秘面纱,深入理解代码背后的秘密,成为真正的软件钟表匠。
admin
2024年7月16日 10:10
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码