[Debugging With GDB]5 中断和继续

info program     显示程序状态信息:是否在运行,什么进程,为何中断。

5.1 断点,监视点,捕获点

断点:以行号,函数名或程序的绝对地址中断,某些系统可以在可执行程序运行前,在共享库里设置断点。

监视点:特殊的断点,在表达式的值改变的时候中断程序。

捕获点:特殊的断点,用来在某些事件发生时中断程序。

5.1.1 设置断点

break location

break ...ifcond

带参数设置断点:在每次断点时计算cond表达式,且当表达式为真(表达式不为0)时中断

tbreak args

temporary breakpoint

设置一个只中断一次的断点

hbreak args

hardware breakpoint

设置一个硬件支持的断点

thbreak args

设置一个只中断一次的硬件支持断点

rbreak regex

匹配正则表达式

info breakpoints

info break

info watchpoints

打印断点,监视点和捕获点

5.1.2 设置监视点

表达式改变

watch expr [thread threadnum]

设置一个表达式监视点,在表达式expr被改写和值改变时GDB中断程序。

[thread threadnum]GDB只在threadnum标识的线程改变表达式expr时中断。注意,只在硬件监视点上GDB才起作用。

watch foo

最常用的用法时监视变量

"

gdb test

b change

r

watch len1

c

c

q

"

rwatch expr [thread threadnum]

读表达式的值时中断

awatch expr [thread threadnum]

读或写表达式的值时中断

info watchpoints

set can-use-hw-watchpoints     设置使用硬件监视点

show can-use-hw-watchpoints     显示硬件监视点的当前模式

5.1.3 设置捕获点

事件中断

catch event     在event发生时中断

event:

throw     C++异常的抛出

catch     C++异常的捕获

exception [exceptionname]     

exception unhandled     没有被程序处理的异常

assert     

exec

fork

vfork

load [libname]     加载共享库

unload [libname]     卸载共享库

tcatch event

5.1.4 删除断点

clear     在选定的栈帧上的下一个指令上删除所有的断点

clear location     在指定的位置删除所有的断点

clear function     删除在名为function入口点上的断点

clear file:function

clear linenum     删除在指定行上的断点

clear file:linenum

delete [breakpoints] [range...]     在指定的范围内删除断点,指定断点num号

5.1.5 禁用断点

disable [breakpoints] [range...]

enable [breakpoints] [range...]

5.1.6 中断条件

condition bnum expression     为断点bnum指定断点条件表达式

condition bnum     从断点bnum里删除条件

"

b change

info breakpoints

condition 1 s1=="hanyu"

r

Error in testing breakpoint condition:

Couldn't write extended state status: 错误的地址.       //不清楚为何报错WWWWWWW,查了下说是linux的bug,可以到window的虚拟机试试

"

一个特殊的条件断点例子是在断点到达一定次数后才中断。

可以使用断点的忽略计数。

ignore bnum count     将断点bnum的忽略计数设置为count

5.1.7 断点命令列表

可以为断点设置一系列命令让断点中断时执行。

为断点bnum指定命令列表:

commands [bnum]

... commands-list ...

end

不带bnum参数的话,commmands指定最后的断点

下面的例子可以用断点命令在foo的入口点,当x>0时打印x的值:

break foo if x>0

commands 

printf "x is %d \n", x

continue

end

用命令给需要的变量设置正确的值:

break 403

commands

set x = y +4

continue

end

5.1.8 断点菜单

对于函数名重载的函数如何打断点

5.2 继续和单步跟踪

continue | c

step [count] | s          

step in单步执行

step count                

单步执行n次

next [count] | n          

当前栈帧单步执行

set step-mode

show step-mode

显示GDB是否中断或越过不带源代码行调试信息的函数

set step-mode on

如果你对一个不带符号信息的函数指令感兴趣,不想GDB越过这个函数

set step-mode off

设置step命令越过不带调试信息的函数

until | u

在当前栈帧上继续执行直到越过当前行的源代码行。和next相比,用来避免多次单步执行一个循环。

until location | u location

继续执行到程序指定的位置。

使用临时断点,比不带参数的util要快。

只有在指定位置的当前帧上,它才会真正被执行。意味着until可以用来跳过函数嵌套调用。

until 99

94 int factorial(int value)

95 {

96      if (value > 1) {

97           value *= factorial(value-1);

98      }

99      return value;

100 }

advance location

继续执行到程序指定的位置。

目标位置不必在当前帧上,不会跳过函数嵌套调用。

stepi arg | si arg

执行一个机器指令,然后中断返回。如display/i $pc,自动显示指令??? $8.6节自动显示

nexti arg | ni arg

5.3 信号

信号是程序里发生的异步事件。

SIGINT     中断信号ctrl+c

SIGSEGV    段错误

SIGALRM    定时器超时

info signals

info handle

handle signal [keywords...]

keywords:

nostop

stop

print

noprint

pass | noignore

nopass | ignore

5.4 中断和开始多线程程序

break linespec thread threadno

break linespec thread threadno if ...

linespec:指定源代码行

break frik.c:13 thread 28 if ab > lim

GDB中断后所有线程将中断,可以查看状态

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《debugging with gdb》是一本关于使用GDB进行调试的指南。GDB(GNU调试器)是一个强大的调试工具,可以用于调试各种编程语言,如C、C++、Fortran等。 这本书详细介绍了GDB的安装和配置,并提供了许多示例来说明如何使用它来调试程序。它从基本的调试命令开始,如设置断点、单步执行、查看变量的值等。然后,它介绍了更高级的调试功能,如条件断点、观察点、跟踪函数调用等。 书中还介绍了如何使用GDB来调试多线程程序和动态库。它解释了如何设置线程断点、查看线程状态和跟踪线程的执行路径。此外,它还介绍了如何对动态链接库进行调试,包括加载和卸载库、查看库中的符号和调用库中的函数等。 此外,《debugging with gdb》还介绍了如何使用GDB进行内存调试。它涵盖了诸如检测内存泄漏、跟踪指针问题和查找内存错误等主题。通过这本书,读者可以学习如何使用GDB来诊断和解决各种程序错误和问题。 总之,《debugging with gdb》是一本全面而详细的关于使用GDB进行调试的指南。无论是有经验的开发人员还是初学者,都可以从中学习到如何使用GDB来快速定位和解决程序中的错误。 ### 回答2: GDB是一个调试器,用于帮助开发者在程序中找出错误并进行调试。它提供了许多功能和命令,可以让开发者在程序运行过程中获取各种有用的信息。 在使用GDB进行调试之前,首先需要将程序编译成可调试的二进制文件。可以使用编译器的参数“-g”来生成包含调试信息的可执行文件。编译完成后,可以通过终端命令"gdb <可执行文件名>"启动GDB,并载入要调试的程序。 一旦进入GDB调试界面,可以使用各种命令来控制程序的执行。例如,可以使用"break <函数名>"命令在特定的函数内设置断点,当程序执行到该函数时会触发断点,并暂停程序的执行。可以使用"run"命令来运行程序,当程序遇到断点时会暂停,并在终端显示相关的调试信息。 一旦程序暂停在断点处,就可以使用GDB提供的许多命令来检查程序状态和寻找错误。例如,可以使用"print <变量名>"命令来打印特定变量的值,以确定其是否符合预期。还可以使用"step"命令来逐行执行程序,并跟踪程序的执行流程,以查找错误所在。 在调试过程中,还可以使用其他命令来查看函数调用栈,设置条件断点,监视特定变量的值等。通过这些命令的使用,可以逐步分析程序的执行过程,找出其中的问题,并进行修复。 在调试完成后,可以使用"quit"命令退出GDB调试界面。调试信息和步骤可以记录下来并与其他开发者共享,以便更好地协作解决问题。 总之,GDB是一个功能强大的调试器,它可以帮助开发者定位和修复程序中的错误。通过使用GDB,开发者可以更加高效地进行程序调试,提高开发效率。 ### 回答3: 《debugging with gdb》是一本介绍使用GDB进行调试的书籍。GDB是GNU工具链中的一个强大的调试工具,用于分析和修复程序中的错误。 该书详细介绍了GDB的各种功能和用法,并通过实例演示了如何利用GDB进行程序调试。它提供了许多实用技巧和建议,帮助读者快速定位和解决程序中的bug。 书中首先介绍了GDB的基本用法,包括启动程序、设置断点、执行程序、查看变量值等。接着,它详细阐述了GDB的高级功能,例如条件断点、观察点、内存调试等。 此外,书中还介绍了GDB调试多线程程序、动态链接程序和嵌入式程序的方法。针对不同的调试需求,它还介绍了GDB的执行控制、堆栈跟踪和源代码级别的调试等高级特性。 《debugging with gdb》还提供了一些常见问题的解决方案,如内存泄漏、数组越界、死锁等。它还解释了一些常见错误的原因和调试技巧,帮助读者更好地理解和定位程序中的问题。 通过阅读《debugging with gdb》,读者可以更好地理解和掌握GDB的使用方法,提高程序调试的效率和准确性。无论是新手还是有经验的程序员,都可以从中受益,提升自己的调试能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值