首页 > 其他分享 >GDB

GDB

时间:2024-09-18 10:03:12浏览次数:8  
标签:info 查看 GDB 线程 断点 调试

GDB 常用命令

GDB 中有许多常用命令,以下是一些常见的命令:

1. 启动调试

  • 启动 GDB

    gdb <可执行文件>
    
  • 附加到运行中的进程
    如果程序已经在运行中,你可以用以下命令来附加到某个正在运行的进程:

    gdb <可执行文件> <进程ID>
    

2. 设置断点

  • 设置断点
    在指定的函数名或行号上设置断点,程序执行到该点时会暂停。

    break <函数名>           # 在函数处设置断点
    break <文件名>:<行号>    # 在文件的某行设置断点
    
  • 条件断点
    你可以为断点添加条件,只有在满足条件时才会暂停。

    break <文件名>:<行号> if <条件>  # 满足条件时中断
    
  • 删除断点
    删除某个断点。

    delete <断点编号>
    
  • 列出所有断点
    查看当前设置的所有断点。

    info breakpoints
    

3. 运行程序

  • 运行程序
    使用 GDB 启动调试的可执行程序,运行时可以传入参数。

    run <参数>
    
  • 重新启动程序
    重新启动调试程序,重新执行。

    run
    

4. 单步执行

  • 单步执行(step)
    执行当前行的代码,如果当前行有函数调用,则进入该函数。

    step
    
  • 逐行执行(next)
    执行当前行的代码,但不会进入函数调用内部。

    next
    
  • 继续执行(continue)
    继续执行程序,直到下一个断点或异常处停止。

    continue
    
  • 返回上一层函数(finish)
    运行当前函数直到返回。

    finish
    
  • 跳过代码执行(jump)
    改变程序的执行流程,将代码跳转到指定行。

    jump <行号>
    

5. 查看程序状态

  • 查看当前代码行
    显示当前代码位置。

    list
    
  • 查看局部变量
    查看当前函数中定义的局部变量的值。

    info locals
    
  • 查看变量值
    显示某个变量的值。

    print <变量名>
    
  • 查看调用栈
    打印当前的函数调用栈。

    backtrace
    
  • 查看寄存器值
    显示 CPU 寄存器的值。

    info registers
    

6. 修改程序状态

  • 设置变量值
    在调试过程中,你可以修改变量的值来影响程序的执行。

    set var <变量名> = <新值>
    
  • 调用函数
    调用调试中的程序的函数,通常用于输出或设置状态。

    call <函数名>(<参数>)
    

7. 调试信息和退出

  • 查看调试信息
    查看当前调试的目标文件信息,例如加载的库。

    info files
    
  • 退出 GDB
    退出 GDB。

    quit
    

如何通过 GDB 定位编译报错的位置?

当你编译 C++ 或 C 程序时,通常编译器会输出具体的错误信息出错行号,你可以根据编译器的错误提示来定位错误。如果编译成功,但运行时程序崩溃或出现段错误(segmentation fault),可以通过 GDB 进行以下步骤来定位错误位置:

1. 开启调试信息编译

为了让 GDB 更好地帮助你调试,建议在编译时加上 -g 参数,生成调试符号信息。

g++ -g -o my_program my_program.cpp

2. 运行程序并定位崩溃

通过 GDB 运行你的程序:

gdb ./my_program

如果程序在运行过程中崩溃,例如遇到段错误(segmentation fault),GDB 会捕获错误并告诉你具体的代码行数。

run <参数>  # 运行程序

当程序崩溃时,GDB 会停在崩溃的地方,输入以下命令查看出错位置:

backtrace  # 查看函数调用栈,找到出错的代码行

backtrace 会打印出调用栈中的每一帧(frame),你可以看到程序执行路径,快速找到出错的位置。

GDB 多线程调试

GDB 支持多线程调试,你可以调试程序中每个线程的执行情况。以下是一些关于多线程调试的常用命令:

1. 查看线程信息

  • 查看所有线程
    通过 info threads 命令可以查看当前进程中的所有线程及其状态。

    info threads
    

    输出类似以下内容:

    Id   Target Id         Frame 
    1    Thread 0x7ffff7fb9740 (LWP 3381) "program" 0x00007ffff7a3aaf0 in __GI___libc_read (fd=3, buf=0x7fffffffeff0, count=8192) at ../sysdeps/unix/sysv/linux/read.c:27
    2    Thread 0x7ffff6fb0740 (LWP 3382) "program" 0x00007ffff7a3b114 in __GI___poll (fds=0x7fffffffe0d0, nfds=1, timeout=-1) at ../sysdeps/unix/sysv/linux/poll.c:29
    

    每个线程都有唯一的 ID,可以看到它们各自的状态(如阻塞、执行等)。

2. 切换到指定线程

  • 切换到指定线程
    使用 thread 命令来切换到特定的线程上下文。

    thread <线程ID>
    

    例如,要切换到线程 2,可以输入:

    thread 2
    

    切换到特定线程后,你可以使用其他调试命令(如 printbacktrace 等)来检查该线程的状态。

3. 调试所有线程

  • 继续运行所有线程
    使用 continue 命令可以恢复所有线程的运行,直到下一个断点或异常触发。

    continue
    
  • 单步调试特定线程
    切换到特定线程后,可以使用 stepnext 命令对该线程进行单步调试,而其他线程会保持不变。

4. 在线程中设置断点

你可以在线程特定的代码部分设置断点,或者在线程启动后动态设置断点。

  • 设置线程特定的断点
    你可以指定断点只在某个线程中触发。

    break <行号> thread <线程ID>
    

    例如:

    break 42 thread 2
    

    这样断点只会在线程 2 执行到第 42 行时触发,而不会影响其他线程。

5. 杀死线程

如果你需要终止某个线程的执行,可以使用以下命令:

thread apply <线程ID> kill

这会终止指定的线程。

6. 查看线程局部变量

在多线程环境中,每个线程都有其自己的局部变量和栈。使用 info locals 可以查看当前线程的局部变量:

info locals

如果要查看其他线程的局部变量,首先切换到该线程,再使用 info locals

总结

  1. **GDB 常用

命令**:包括设置断点、运行程序、单步调试、查看变量、查看调用栈等,可以帮助你逐步检查和定位问题。

  1. 编译时定位错误:如果程序崩溃,可以使用 GDB 的 runbacktrace 命令来定位具体的崩溃位置,并使用调试信息(如局部变量和调用栈)进一步分析问题。

  2. 多线程调试:GDB 支持多线程调试,提供了 info threadsthreadthread apply 等命令,帮助你查看每个线程的状态,并切换线程调试每个线程的执行过程。

通过这些命令和调试技巧,你可以更有效地分析和解决多线程程序中的问题。

标签:info,查看,GDB,线程,断点,调试
From: https://www.cnblogs.com/lihaoxiang/p/18417987

相关文章

  • 在ubuntu中安装较新版本的gcc和gdb
    要在Ubuntu中安装较新版本的GCC和GDB,可以通过以下几种方法实现。Ubuntu的默认包管理器apt提供的软件包通常不是最新的,因此需要使用PPA或手动编译以获取较新版本。方法1:使用ppa:ubuntu-toolchain-r/test安装最新版本的GCC和GDBUbuntuToolchainPPA提供了更新的......
  • Linux内核开发环境-使用GDB调试内核代码
    建议点击这里查看个人主页上的最新原文作者:陈孝松主页:chenxiaosong.com哔哩哔哩:陈孝松课程:chenxiaosong.com/courses博客:chenxiaosong.com/blog贡献:chenxiaosong.com/contributions邮箱:[email protected]交流群:544216206,点击查看群介绍点......
  • Linux调试器--gdb/cgdb
    ......
  • gdb动态调试初步学习
    CTF题目simple-check-100先分析主程序可以得出需要通过check_key然后就可以输出flag了gdb启动在main函数那里打一个断点r运行到断点位置n单步调试直到testeax,eax查看eax的值ireax设置eax的值为1set$eax=1c继续直接运行完......
  • 实例:使用 gdb 查看进程内存中的数据结构
    代码示例首先,创建一个简单的链表程序linked_list.c,以演示如何使用gdb查看内存中的数据结构。#include<stdio.h>#include<stdlib.h>//定义链表节点结构体typedefstructNode{intdata;structNode*next;}Node;//添加新节点到链表的尾部voidappen......
  • C++ 使用终端GDB调试复杂项目中Segmentation Fault 和 std::bad_alloc问题
            近期在公司虚拟机上写代码遇到SegmentationFault和std::bad_alloc问题,但是项目庞大,在不了解功能、代码连接关系的时候很难追踪具体是什么地方出了问题。网络上许多关于GDB的教程仅仅停留在简单的示例中的调试,对于复杂的项目结构(多文件,多作用域,......)来说显......
  • 使用GDB调试(上篇:配置、分析core文件)
    在Linux系统中配置生成用于GDB分析的coredump(核心转储)文件,可以按照以下步骤进行:步骤1:核心转储使能设置首先,你需要确认系统的核心转储设置是否符合要求。可以通过以下命令检查当前设置:bashCopyCodeulimit-c1.临时配置这个命令会显示核心转储文件的最大......
  • 使用GDB调试(下篇:调试应用)
    在GDB(GNUDebugger)中,有一些常用的调试命令可以帮助你在调试过程中检查程序的状态、执行程序、设置断点等。以下是一些常用的GDB调试命令: 1.启动程序和执行控制: run:启动正在调试的程序。 continue(c):继续执行程序,直到遇到下一个断点或者程序结束。 next(n)......
  • Linux C++ 开发7 - GDB常用命令汇总(你想了解的都在这)
    1.运行命令2.设置断点3.查看源码4.打印表达式5.查看运行信息5.1.设置和查看运行参数的Demo6.分割窗口7.参考文档上一篇《LinuxC++开发6-GDB调试》中我们讲解了GDB的调试流程和常用的调试方法。GDB的调试指令众多,我们这里针对常用的指令做一个汇总(按功能......
  • Linux C++ 开发7 - GDB常用命令汇总(你想了解的都在这)
    1.运行命令2.设置断点3.查看源码4.打印表达式5.查看运行信息5.1.设置和查看运行参数的Demo6.分割窗口7.参考文档上一篇《LinuxC++开发6-GDB调试》中我们讲解了GDB的调试流程和常用的调试方法。GDB的调试指令众多,我们这里针对常用的指令做一个汇总(按功能分......