打造远胜IDE的调试器gdb

2024-04-22 14:18
文章标签 打造 ide gdb 调试器 远胜

本文主要是介绍打造远胜IDE的调试器gdb,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要:在编程过程中,最消耗时间的莫过于编码和调试,而这两项又和我们使用的工具具有很大的关系。对于从windows转到linux/Unix上的用户来说,更是如此。在这里,我们跳过系统优劣之争论,教你如何打造属于自己的编程环境。本文是针对广大linux平台用户而言(你也可以在win下使用相关工具),目标是打造比IDEelipse或者VS)更高效的编程环境。如果你有什么好的使用习惯和心得,谢谢分享给我。

1.前沿

gdb是我们用来调试程序的工具,它可以用来:1)运行程序 2)让程序停止到任何你想要停止的地方 3)在程序结束之后,查看程序发生了什么 4)在程序运行过程中改变程序行为。高效使用gdb包含三个层次:第一,能使用gdb的基本命令(startbreakcontinue等)运行和调试程序。第二,会使用gdb的高级命令来观察程执行过程中的行为(函数堆栈,变量监控等)。第三,自定义gdb宏,从而让你的gdb能够随心所欲地运行。关于gdb的基本命令和高级命令,你可以参考这里:本文只是对最长用的命令加以整理而已。

2.gdb基本命令简介

checklist: 如何让程序开始运行——start如何在某一行设置断点——break 如何删除断点、如何禁用断点如何让程序连续运行,在断点处停止——continue如何单步调试——next如何进入函数内部——step如何查看那上下文代码——list

3.高级命令

如何设置条件断点——break如何检测某个变量或者表达式的值——watch如何让调试更加自动化——commands------end如何让程序从当前循环或者函数退出——finish /util如何查看变量的值——print自动化调试——commands如何查看函数堆栈——stack如何避免每次调试都输入同样的命令—— -x选项

4.定义gdb

这一部分是高效使用gdb的关键所在,用好了,能够让gdb的调试效率要远远高于IDEgdb在运行之前,会读取gdb的配置文件,~/.gdbinit,这个文件的作用类似于~/.vimrc。我们可以在里面定义一些常用的操作,从而加快gdb调试时候的运行。下面,看看我主要用的一些gdb配置,更多详细的gdb配置可以看这里:
其中,gdb配置文件的格式如下:
define commandname
command
end
document commandname
comment
end
具体内容如下,可以通过查看document来分析相应命令实现的功能,本文不再一一列举。总结一下下面的配置实现的功能:
清屏cls、显示断点信息bpl、设置断点(bp)、清理断点bpc、断点使能bpe、断点禁用bpd、临时断点bpt、监视点bpm、执行到第几行goto
define clsshell clearenddocument clsClears the screen with a simple command.enddefine bplinfo breakpointsenddocument bplList breakpointsenddefine bpbreak  $arg0enddocument bpSet a breakpoint on addressUsage: bp addrenddefine bpcclear $arg0enddocument bpcClear breakpoint at function/addressUsage: bpc addrenddefine bpeenable $arg0enddocument bpeEnable breakpoint #Usage: bpe numenddefine bpddisable $arg0enddocument bpdDisable breakpoint #Usage: bpd numenddefine bpttbreak $arg0enddocument bptSet a temporary breakpoint on addressUsage: bpt addrenddefine bpmawatch $arg0enddocument bpmSet a read/write breakpoint on addressUsage: bpm addrend##otherdefine gototbreak $arg0continueenddocument gotorun to cursorUsage goto linenumend####pro infodefine argvshow argsenddocument argvPrint program argumentsenddefine funcinfo functionsenddocument funcPrint functions in targetenddefine varinfo variablesenddocument varPrint variables (symbols) in targetenddefine libinfo sharedlibraryenddocument libPrint shared libraries linked to targetenddefine siginfo signalsenddocument sigPrint signal actions for targetenddefine threadinfo threadsenddocument threadPrint threads in targetenddefine uinfo udotenddocument uPrint kernel 'user' struct for targetenddefine disdisassemble $arg0enddocument disDisassemble addressUsage: dis addrend## only stack and frame and argv is need

5.多线程调试命令

info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。

thread ID 切换当前调试的线程为指定ID的线程。

break thread_test.c:123 thread all 在所有线程中相应的行上设置断点

thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。 

thread apply all command 让所有被调试线程执行GDB命令command。

set scheduler-locking off|on|step 估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

 

gdb对于多线程程序的调试有如下的支持:

  • 线程产生通知:在产生新的线程时, gdb会给出提示信息

(gdb) r Starting program: /root/thread  [New Thread 1073951360 (LWP 12900)]  [New Thread 1082342592 (LWP 12907)]---以下三个为新产生的线程 [New Thread 1090731072 (LWP 12908)] [New Thread 1099119552 (LWP 12909)]

  • 查看线程:使用info threads可以查看运行的线程。

(gdb) info threadsThread 1099119552 (LWP 12940)   0xffffe002 in ?? ()3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? () 1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21 (gdb)

注意,行首的蓝色文字为gdb分配的线程号,对线程进行切换时,使用该该号码,而不是上文标出的绿色数字。

另外,行首的红色星号标识了当前活动的线程

  • 切换线程:使用 thread THREADNUMBER 进行切换,THREADNUMBER 为上文提到的线程号。下例显示将活动线程从 1 切换至 4。

(gdb) info threads4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? () * 1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21 (gdb) thread 4 [Switching to thread 4 (Thread 1099119552 (LWP 12940))]#0   0xffffe002 in ?? () (gdb) info threads * 4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21 (gdb)

 

后面就是直接在你的线程函数里面设置断点,然后continue到那个断点,一般情况下多线程的时候,由于是同时运行的,最好设置 set scheduler-locking on

这样的话,只调试当前线程 

6.堆栈相关

 在调试程序的过程中,查看程序的函数调用堆栈是一项最基本的任务,几乎所有的图形调试器都支持这项特性。

      GDB调试器当然也支持这一特性,但是功能更加灵活和丰富。

      GDB将当前函数的栈帧编号为0,为外层函数的栈帧依次加1,这些编号将成为一些GDB命令的参数,以指明将要操作的是哪一个函数的栈帧。

      GDB还支持使用Address作为栈帧的标识符,可在栈帧编号被破坏的情况下使用。

      1.在栈帧之间切换

          GDB中有很多针对调用堆栈的命令,都需要一个目标栈帧,例如打印局部变量值的命令。

          frame args 将当前栈帧设置为args(编号或Address)指定的栈帧,并打印该栈帧的简要信息。

          select-frame args 与frame args相同,但是不打印栈帧信息。

          up n 向上回退n个栈帧(更外层),n默认为1. 

          down n 向下前进n个栈帧(更内层),n默认为1.

          up-silently n 与up n相同,但是不打印信息。

          down-silently n 与down n相同,但是不打印信息。

      2.打印栈帧信息(不移动栈帧)

          frame 打印当前栈帧的简要信息。

          info frame 打印当前栈帧的详细信息。

          info frame args 打印指定栈帧的详细信息。

          info args 打印函数参数信息。

          info locals 打印当前可访问的局部变量的信息。

      3.打印调用堆栈

          backtrace 打印全部栈帧的简要信息,按Ctrl-c可终止打印。

          backtrace n 打印最内层的n个栈帧的简要信息。

          backtrace -n 打印最外层的n个栈帧的简要信息。

          backtrace full 打印全部栈帧的详细信息。

          backtrace full n 打印最内层的n个栈帧的详细信息。

          backtrace full -n 打印最外层的n个栈帧的详细信息。

      4.一些配置项

          set backtrace past-main on 对调用堆栈的打印可越过main函数。

          set backtrace past-main off 对调用堆栈的打印止步于main函数。

这篇关于打造远胜IDE的调试器gdb的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926014

相关文章

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

GDB调试程序入门

http://blog.csdn.net/haoel/article/details/2880 用GDB调试程序 GDB概述 ———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所

git的使用和gdb工具

1.git的使用 首先现在gitee上新建一个仓库 然后复制克隆链接到本地仓库 在本地仓库中,我们可以用git status查看仓库状态 我们要提交代码就是要三步 git add 文件名 git commit -m "写提交的日志" git push 将代码上传到远端仓库 然后你就完成一次提交了 2.调试工具gdb 程序的发布模式有两种,de

VitePress 自定义主题:打造专属文档网站

VitePress 是一个基于 Vite 和 Vue 3 的静态网站生成器,特别适用于撰写文档。它不仅提供了默认的主题,还允许开发者创建和使用自定义主题,以满足特定的设计和功能需求。本文将详细介绍如何创建、使用及分发 VitePress 自定义主题,并通过实例代码进行演示。 一、创建自定义主题 1. 主题文件结构 要启用自定义主题,你需要在项目根目录下的 .vitepress 文件夹中创建一

GDB watch starti i files

watch break starti 在程序的最初开始运行的位置处断下来 ​​ i files 查看程序及加载的 so 的 sections ​​

从零开始:打造你的第一个餐厅点餐小程序

目录 1 为什么选择点餐小程序2 会有哪些功能2.1 顾客端2.2 服务员端2.3 后厨端2.4 收银端2.5 管理员(老板)端 3 开发工具选择4 你将获得什么让我们开始吧 最近,有不少粉丝咨询,有没有系统的低代码学习教程呀?为啥你的教程有的刚看的提起兴趣,怎么突然就中断了。有没有系统的视频学习教程呀,你是不是还有压箱底的好宝贝,没开放给我们看呀。 还真不是,压箱底的好宝贝已