代码编织梦想

上篇文章已经认识了GDB调试工具的简单使用方法,已满足日常的使用需求。本文重点介绍GDB进阶内容中的运行程序、暂停程序。

运行程序

在gdb中,运行程序使用r或run即可运行程序,但有可能会需要有以下四个方面设置的需求:

  1. 程序运行参数

    set args  #指定运行时参数
    show args #查看设置好的运行参数
    
  2. 运行环境

    path <dir> # 可设定程序的运行路径
    show paths # 查看程序的运行环境
    set environment varname[=value] # 设置环境变量
    show enviroment [varname] #查看环境变量
    
  3. 工作目录

    cd <dir> #相当于shell的 cd 命令
    pwd #显示当前所在目录
    
  4. 程序的输入输出

    info terminal #显示你程序用到的终端模式
    run > file #控制程序输出到文件
    
  • gdb还可以调试已经运行的程序:
#方法一: ps获取程序PID
gdb <程序名> PID
#方法二:先关联上程序,再挂接进行PID
gdb <程序名>
attach PID # 挂接PID
detach PID # 取消挂接

暂停程序

调试程序中,暂停程序运行是必须的, GDB 可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。

在 gdb 中,我们可以有以下几种暂停方式: 断点( BreakPoint )、观察点( WatchPoint )、捕捉点(CatchPoint )、信号( Signals )、线程停止( Thread Stops )。如果要恢复程序运行,可以使用 c 或是 continue 命令

当进程被 gdb 停住时,你可以使用 info <程序名>来查看程序的是否在运行,进程号,被暂停的原因

一、断点

设置程序停住的地方,可以选择以下几种方式设置断点:

1. break functionname  在进入指定函数时停住
2. break linenum 在指定的行号停住
   break +offset 在当前行号前offset行停住
   break -offset
3. break filename:functionname 在源文件filename的functionname入口处停住
4. break filename:linenum 在源文件filename的linenum行处停住
5. break *address 在程序运行的内存
6. break 没有参数时表示在下一条指令处停住
7. break ... if <condition>  ...可以上上面的参数,condition表示条件,当条件满足时停住
8. info break 查看断点

断点菜单:

在 C++ 中,可能会重复出现同一个名字的函数若干次(函数重载),在这种情况下, break < function > 不能告诉 GDB 要停在哪个函数的入口。当然,你可以使用 break<function(type)> 也就是把函数的参数类型告诉 GDB ,以指定一个函数,否则的话GDB会返回一个断点菜单供你选择:

二、观察点

观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化, 马上停住程序。我们有下面的几种方法来设置观察点:

watch <expr> # 为表达式(变量) expr 设置一个观察点。一但表达式值有变化时,马上停住程序
rwatch <expr> # 当表达式(变量) expr 被读时,停住程序
awach <expr> # 当表达式(变量)的值被读或被写时,停住程序
info watchpoints # 列出当前所设置的所有观察点

三、设置捕捉点

捕获程序运行时的一些事件。如:载入共享库(动态链接库)或是 C++ 的异常

catch <event>

当 event 发生时,停住程序。 event 可以是下面的内容:
1 、 throw 一个 C++ 抛出的异常。( throw 为关键字)
2 、 catch 一个 C++ 捕捉到的异常。( catch 为关键字)
3 、 exec 调用系统调用 exec 时。( exec 为关键字,目前此功能只在 HP-UX 下有用)
4 、 fork 调用系统调用 fork 时。( fork 为关键字,目前此功能只在 HP-UX 下有用)
5 、 vfork 调用系统调用 vfork 时。( vfork 为关键字,目前此功能只在 HP-UX 下有用)
6 、 load 或 load < libname > 载入共享库(动态链接库)时。( load 为关键字,目前此功能只在 HP-UX 下有用)
7 、 unload 或 unload 卸载共享库(动态链接库)时。( unload 为关键字,目前此功能只在 HP-UX 下有用)

tcatch <event> # 只设置一次捕捉点,当程序停住以后,应点被自动删除。

四、失能或删除停止点

上面说了如何设置程序的停止点, GDB 中的停止点也就是上述的三类。

在 GDB 中,如果你觉得已定义好的停止点没有用了,你可以使用 delete 、 clear 、 disable 、 enable 这几个命令来进行维护。

  • 删除
clear  # 清除所有已定义的停止点
clear <functionname>clear <filename:functionname>  # 清除所有设置在函数上的停止点
clear <linenum>clear <filename:linenum> # 清除所有设置在指定行上的停止点
delete [breakpoints] [range...] # 删除指定的断点,range表示断点号范围
  • 失能
disable [breakpoints] [range...]
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_37935970/article/details/127173627

gdb调试方法_techping的博客-爱代码爱编程

gdb是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 启动gdb 使用gdb之前,需要讲程序编译出带Debug信息的格式。(带上 -g 参数) -

linux学习笔记----进阶部分-----2,程序调试-爱代码爱编程

1,进程调试 gdb程序交互调试 GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于,命令行的、功能强大的程序调试工具。 以下从一个完整的调试过程简单说明最基本的几个命令; $gdb programmer # 启动gdb >break main # 设置断点 >run

linux学习笔记----进阶工具部分-----1,gdb调试利器-爱代码爱编程

自我总结 + 优秀摘录 1,启动gdb 对C/C++程序的调试需要在编译前加上-g选项:g++ -g hello.cpp -o hello 调试可执行文件: gdb <program> 调试core文件(core是程序非法执行后core dump后产生的文件):gdb program core.1122 调试服务程序: gdb <

使用cuda-gdb调试cu程序-爱代码爱编程

https://blog.csdn.net/FishSeeker/article/details/74178318 简要教程 仿佛对于.cu程序的调试是需要关闭x的,所以学习了一下如何用cuda-gdb在tty下调试.cu程序. 1. 对于.cu文件是需要编译好才能调试的,首先cd到想要编译的.cu目录下,使用以下命令进行编译:nvcc -g -G fi

gdb调试进阶-爱代码爱编程

1.1.1 断点commands高级功能 大多数时候需要在断点处执行一系列动作,gdb提供了在断点处执行命令的高级功能commands。 [](javascript:void(0)😉 #include <stdio.h> int total = 0; int square(int i) { int result=0;

Linux内核编程学习--GDB调试-爱代码爱编程

目录 一、引言 二、GDB的基本使用 ----->gdb基本调试命令 ----->gdb断点调试命令 ----->gdb检查修改运行中的代码 三、GDB的进阶使用 四、转储文件(core) ----->core文件的配置 ----->使用转储文件进行GDB调试 一、引言 最近在项目开发中遇到了栈内存错误的

linux--工具进阶-爱代码爱编程

linux学习 看完了基础篇,下面来看进阶篇 我好想哭看这的时候,好多只是听说过,但完全没有试过,感觉自己懂得有点少,就是缺乏一些知识储备,也就是必须知道了某些或学过了某些知识才适合来看这一部分,看得太早了,不过看看也好,以后再见到就不陌生了。这篇主要就是在linux编写程序,调试程序,优化性能,这是以后一定要接触了解到的,硬是硬着头皮看完了。 一般

gdb进阶操作-爱代码爱编程

gdb入门操作:https://blog.csdn.net/qq_15437629/article/details/77587652 最近遇到一些奇怪的core,可能是踩内存或是use after free,这种问题不太好定位,但是可以通过core的内存信息进行分析。 首先介绍下gdb 的x命令 x/[number][format] <addr

C++开发工程师成长之路----进阶篇-爱代码爱编程

一、C/C++开发常用工具 常用工具介绍之C++集成开发环境(IDE) Microsoft Visual Studio: Windows平台下代码开发与编译工具,配合Visual Assist可跳转查看代码 VSCode: Windows平台下代码开发与编译工具,属于轻量型开发工具,需要配置插件 Ubuntu: Linux平台下代码开发和编译工具,可以灵

[已迁移]xctf-高手进阶区-stack2[recorded]-爱代码爱编程

部分借鉴这位师傅 保护 canary的绕过还有一种方法就是数组下标溢出 int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax unsigned int index; // [esp+18h] [ebp-90h] BYREF unsig

[已迁移]xctf-高手进阶区-Recho[recorder]-爱代码爱编程

前置知识: 如果有flag藏在bss段,可以用系统调用的方式打开字符串 syscall()+rax(rax=2)=open('addr',readonly) 为了结束while的read循环 while ( read(0, nptr, 0x10uLL) > 0 ) 可以用 p.shutdown('send') 命令,不过不能再发送第

[已迁移]xctf-pwn-高手进阶区-babyfengshui-爱代码爱编程

堆风水 堆风水 代码审计 overview void __cdecl __noreturn main() { char v0; // [esp+3h] [ebp-15h] BYREF int v1; // [esp+4h] [ebp-14h] BYREF size_t v2[4]; // [esp+8h] [ebp-10h] BYREF

[已迁移]xctf-pwn-高手进阶区-1000levevls-爱代码爱编程

reference:L.o.Wwhiteh4nd 代码审计 overview __int64 __fastcall main(__int64 a1, char **a2, char **a3) { int v3; // eax __int64 v4; // rdx __int64 v5; // rcx sub_DDC(a1, a2,

gdb进阶-爱代码爱编程

一、gdb的安装 由于这是进阶的介绍,如果不会安装请自行百度; 二、调试前的准备 用gcc编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加-g的参数,例如: gcc -g -o aa demo.c 在命令提示符下输入gdb aa就可以调试demo.c程序了; gdb aa 三、基本调试命