首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在gdb中正确设置行号断点?

在 GDB(GNU Debugger)中设置行号断点是调试程序时常用的操作。行号断点允许你在程序的特定行暂停执行,以便检查程序的状态和变量的值。以下是如何在 GDB 中正确设置行号断点的详细步骤。

前提条件

  1. 编译程序时启用调试信息:确保在编译程序时使用了 -g 选项,以包含调试信息。例如,使用 gcc 编译时: gcc -g -o my_program my_program.c
  2. 启动 GDB:在命令行中启动 GDB,并加载你的程序: gdb ./my_program

设置行号断点

假设你有一个名为 my_program.c 的源文件,并且你想在第 42 行设置一个断点。以下是设置行号断点的步骤:

  1. 启动 GDB 并加载程序: gdb ./my_program
  2. 设置断点:使用 break 命令设置行号断点。你可以指定文件名和行号,或者在当前文件中直接指定行号。
    • 指定文件名和行号: (gdb) break my_program.c:42
    • 在当前文件中直接指定行号(假设你已经在 GDB 中加载了源文件): (gdb) break 42
  3. 运行程序:使用 run 命令运行程序。程序将在你设置的断点处暂停。 (gdb) run
  4. 检查断点:当程序在断点处暂停时,你可以使用 GDB 的各种命令来检查程序的状态。例如,使用 print 命令查看变量的值: (gdb) print my_variable

示例

以下是一个完整的示例,展示了如何在 GDB 中设置行号断点并调试程序。

假设你有一个简单的 C 程序 my_program.c

代码语言:javascript
复制
#include <stdio.h>

void foo() {
    int x = 42;
    printf("x = %d\n", x);
}

int main() {
    foo();
    return 0;
}
  1. 编译程序: gcc -g -o my_program my_program.c
  2. 启动 GDB 并加载程序: gdb ./my_program
  3. 设置断点:在 foo 函数的 printf 行设置断点(假设这是第 6 行)。 (gdb) break my_program.c:6
  4. 运行程序: (gdb) run
  5. 程序将在断点处暂停。你可以检查变量 x 的值: (gdb) print x
  6. 继续执行程序:使用 continue 命令继续执行程序,直到下一个断点或程序结束。 (gdb) continue

其他有用的 GDB 命令

  • 查看断点:使用 info breakpoints 命令查看当前设置的所有断点。 (gdb) info breakpoints
  • 删除断点:使用 delete 命令删除特定的断点。例如,删除断点 1: (gdb) delete 1
  • 禁用断点:使用 disable 命令禁用特定的断点。例如,禁用断点 1: (gdb) disable 1
  • 启用断点:使用 enable 命令启用特定的断点。例如,启用断点 1: (gdb) enable 1

通过这些步骤和命令,你可以在 GDB 中正确设置行号断点,并有效地调试你的程序。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Linux】调试工具gdb的使用

断点操作(b) 首先,假如我们没有设置断点,我们输入r(run),此时程序则会从开始,一直运行到结束。假如我们设置了断点,程序则会运行到断点处进行停止。...打断点 r: 运行程序,无断点的话,直接运行到结束,有断点运行到最近的断点处停止(r不能在断点间移动,即运行到最近断点处后,再次输入r,则会重新再次运行) b(break) 行号 :在某一行设置断点...,再次进行设置,那么断点的编号就变成了2,除非退出gdb,否则一直累加。...调试bt命令观察所调用堆栈 跳转指定行(until) 在vs中,我们在调试时要想跳转至指定行号的地方,我们通常都是f9打断点,f5直接运行到该断点,来实现跳转,但是在gdb中,我们可以在不打断点的情况下跳转至我们指定的行号位置...断点之间跳转(c) 我们知道vs下可以使用f5来进行断点之间的切换,gdb中也可以,命令为c(vs中的f5)(vs中使用f5都是处于调试状态下,因此gdb也是如此) 关于gdb的其它一些指令 gdb的指令还有很多

3.4K30
  • linux下gdb调试方法与技巧整理「建议收藏」

    I'm liu [Inferior 1 (process 19987) exited normally] (gdb) 4、设置断点 break(简写 b) :格式 b 行号,在某行设置断点; info...; call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55); quit:简记为 q ,退出gdb; 三、gdb基本使用命令 1、运行命令 run:简记为...call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55) quit:简记为 q ,退出gdb 2、设置断点 break n (简写b n):在第n行处设置断点...如:break cb_button delete 断点号n:删除第n个断点 disable 断点号n:暂停第n个断点 enable 断点号n:开启第n个断点 clear 行号n:清除第n行的断点...list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12 list 函数名:将显示“函数名”所在函数的源代码,如:list main list :不带参数,将接着上一次 list

    2.7K20

    Linux下GDB调试指令总结

    call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55) quit(简写q) : 退出gdb 02 设置断点: break n (简写b n):在第n行处设置断点...(可以带上代码路径和代码名称:b OAGUPDATE.cpp:578) b fn1 if a>b:条件断点设置 break func(break缩写为b):在函数func()的入口处设置断点,如:break...cb_button delete 断点号n:删除第n个断点 disable 断点号n:暂停第n个断点 enable 断点号n:开启第n个断点 clear 行号n:清除第n行的断点 info b (info...list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12 list 函数名:将显示“函数名”所在函数的源代码,如:list main list :不带参数,将接着上一次 list...如:display a watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。

    4.6K20

    【Linux】开始使用gdb吧!

    2 开始使用 首先进入gdb直接使用:gdb 文件名 接下来我直接给出 gdb 的 所有功能命令(注意简写形式,会经常使用): list /l 行号:显示指定行号附近的源代码,每次显示10行,从当前光标位置向下滚动...相当于 F11 break(b) 行号:在指定的行号设置断点。相当于 F9 break 函数名:在指定函数的开头设置断点。 info break:显示所有断点的信息。...例如,ignore 1 main 会让断点1在主函数上失效 info(或i) breakpoints:显示当前设置的所有断点。...undisplay:取消对先前设置的变量的跟踪。 until X行号:继续执行程序,直到达到指定的行号。...这是因为 gdb操作的应该是编译后的文件 当编译时,未加 - g 选项,则进入gdb环境中执行命令会出现No symbol table is loaded.

    44310

    【Linux】Linux调试器-gdb使用

    s或step:进入函数调用 break(b) 行号:在某一行设置断点 break 函数名:在某个函数开头设置断点 info break :查看断点信息。...breakpoints n:删除序号为n的断点 disable breakpoints:禁用断点 enable breakpoints:启用断点 info(或i) breakpoints:参看当前设置了哪些断点...(可简写为 i b) display 变量名:跟踪查看一个变量,每次停下来都显示它的值 undisplay:取消对先前设置的那些变量的跟踪 until X行号:跳至X行(中间的代码都是运行了的) breaktrace...(或bt):查看各级函数调用及参数 info(i) locals:查看当前栈帧局部变量的值 quit:退出gdb 我们打断点后,如果要删,需要 d 断点的序号。...在调试过程中是可以修改变量的值的,用set var 修改变量。通常用来判断循环条件,这样做可能会导致最终的值不正确。

    27800

    GDB调试入门,看这篇就够了

    #对test.c中的所有函数设置断点 rbreak test.c:^print #对以print开头的函数设置断点 设置临时断点 假设某处的断点只想生效一次,那么可以设置临时断点,这样断点后面就不复存在了...filename中函数function处的断点 clear lineNum #删除行号为lineNum处的断点 clear f:lename:lineNum #删除文件filename中行号为lineNum...源码查看 前言 我们在调试过程中难免要对照源码进行查看,如果已经开始了调试,而查看源码或者编辑源码却要另外打开一个窗口,那未免显得太麻烦。文本将会介绍如何在GDB调试模式下查看源码或对源码进行编辑。...(gdb) 设置完成后,可以通过show substitute-path来查看设置结果。这样它也能在正确的路径查找源码啦。...小结 本节介绍了GDB调试中的源码查看,源码编辑以及如何在GDB调试模式下执行shell命令。 总结 本文介绍了GDB最常见的用法,了解这些之后能够使用GDB定位大部分问题。

    7.7K62

    【Linux系统编程】Linux调试器——gdb 的基本使用

    但是如何在Linux上调式代码我们还不知道,所以今天要学的是Linux调试器——gdb 的基本使用。 1. 准备工作及知识补充 那要使用调式器调式,首先我们得有代码,有可执行程序。...我们说了Linux中的调式器是gdb,那如何使用gdb调式 如果你的机器上没有gdb可以先安装一下:sudo yum install -y gdb 然后调式的话,第一步直接gdb+可执行文件名...在 Debug 模式下,编译器会生成带有调试符号信息的可执行文件,这些符号信息包含了变量名、函数名和源代码行号等,以便在调试过程中能够准确地追踪错误。...b(break point)+ 行号/函数名:就可以把指定行或指定函数(打在函数内第一条语句处)设置为断点 如果是多文件的话,我们还可以指定文件去给对应的函数或指定行打断点 b 文件名:行号/...那在gdb中与之对应的操作是什么呢? 首先逐过程: 开始调式,到16行的断点就停止了,对应的是一个函数调用。 如果我想逐过程,直接走到下一句代码呢?

    50110

    GDB调试还不会?看这篇就够了!

    根据行号设置断点 b 9 #break 可简写为b 或者 b test.c:9 程序运行到第9行的时候会断住。...#对test.c中的所有函数设置断点 rbreak test.c:^print #对以print开头的函数设置断点 设置临时断点 假设某处的断点只想生效一次,那么可以设置临时断点,这样断点后面就不复存在了...filename中函数function处的断点 clear lineNum #删除行号为lineNum处的断点 clear f:lename:lineNum #删除文件filename中行号为lineNum...(gdb) 设置完成后,可以通过show substitute-path来查看设置结果。这样它也能在正确的路径查找源码啦。...总结 本文介绍了GDB调试中的源码查看,源码编辑以及如何在GDB调试模式下执行shell命令。

    4.9K21

    【探索 GDB 和 CGDB】:强大的调试工具介绍

    1.2 两者各自的功能 【GDB 的主要功能】 启动程序:可以在 GDB 中启动程序,设置参数和环境变量。 设置断点:允许用户在程序中的特定位置设置断点,以便程序执行到该位置时暂停。...、有断点从第一个断点处开始运行】 b(breakpoint) + 行号 在哪一行打断点 b 源文件:函数名 在该函数的第一行打上断点 b 源文件:行号 在该源文件中的这行加上一个断点 info b 查看断点的信息...breakpoint already hit 1 time 【此断点被命中一次】 d(delete) + 当前要删除断点的编号 删除一个断点【不可以d + 行号】 若当前没有跳出过gdb 则断点的编号会持续累加...给已有断点追加 新增:b 行号/文件名:行号/函数名 if i == 30 (条件) 给已有断点追加:condition 2 i == 30, 其中 2 是已有断点编号,没有if 在此其他的指令我们就不过多讲解...为什么要使用gdb / cgdb 来调试 1. 强大的调试功能 GDB 功能强大:GDB 允许开发者进行单步调试、设置断点、观察变量的值、检查内存状态等。

    22310

    Linux工具学习之【gdb】

    ,其中首字母 b 就表示断点的意思,因为是纯命令行操作,所以刚开始调试麻烦点是必然的 ️设置断点 指令 b 需要配合行号或函数名进行断点设置 (gdb) b 行号 //在指定行号打断点 (gdb) b...//单步运行,会进入函数内部 单步:即一步一步的来,如果遇到函数,就会进入函数内部,确保程序的每一步都被执行 查看变量 调试过程中还有一个很重要的工作:查看变量信息,如VS中的监视窗口,假设没有监视功能...,我们可以直接通过 until 行号 的方式跳转至指定行,这个指令通常用来跳过循环 (gdb) until 行号 //跳转至指定行 finish 函数 这个指令主要是针对函数的,直接 finish 就可以在不打断点的情况下...,在不取消断点的情况下让断点失效 (gdb) disable 断点编号 //关闭断点 能关闭当然也能打开 (gdb) enable 断点编号 //打开断点 set var 设置条件 给变量设置条件...,使程序运行至设定值那一步,比如 set var i=5 后,程序就运行至 i=5 的那一步了 (gdb) set var 变量值 //设置变量值 这个功能就像VS中的给断点设置条件,然后跳转 ptype

    20820

    GDB的那些奇淫技巧

    噢,断点都打不上,理由很简单,因为不同进程之间的虚拟地址空间都不一样。 另外一个回答中说了,虽然不能断在指定地址,但我们可以break main,告诉 gdb 把断点设置在 main 函数。...这在 gdb 中可以使用environment参数,不过需要注意的是该参数的设置是以空格为切分而不是传统的以=对环境变量赋值。...101 对源代码的行号设置断点,可简写为 b 101 break basic.c:101 对源代码和行号设置断点 break basic.c:foo 对源代码和函数名设置断点 break *0x00400448...clear 删除在当前行的断点 clear function 删除函数断点 clear line 删除行号断点 clear basic.c:101 删除文件名和行号的断点 clear basic.c...{regexpr} 匹配正则的函数前断点,如 ex_* 将断点 ex_ 开头的函数 tbreak function/line 临时断点 hbreak function/line 硬件断点 ignore

    1.3K20

    【Linux】深度解析与实战应用:GCCG++编译器入门指南

    在Debug模式下,编译器会生成包含大量调试信息的二进制文件,这些调试信息包括源代码的行号、变量名、函数名等,这些信息对于使用调试器(如GDB)来跟踪程序执行、检查变量值、设置断点等非常有用。...例如,要调试名为test的程序,可以输入: gdb test 设置断点 在GDB中,断点是最常用的功能之一。它允许程序在执行到特定行时暂停。可以通过break(简写为b)命令设置断点。...例如,在程序第10行设置断点: (gdb) b 10 或者,如果知道函数名,也可以直接在函数处设置断点: (gdb) break main 查看断点 使用info breakpoints命令这是查看断点信息的最直接方式...在GDB命令行中输入info breakpoints(或简写为info b),GDB会列出所有已设置的断点信息,包括断点的编号、类型、是否启用、地址以及断点所在的源代码位置等。...删除断点 delete 断点编号:删除指定编号的断点。 clear 文件名:行号:删除指定文件和行号上的断点。

    21810

    基础理论

    [PWN][基础篇]基础理论 1、相关知识 2、栈帧 3、实例教学 1、相关知识 溢出概念:在计算机中,当要表示的数据超出计算机所使用的的数据表示范围时,产生了数据的溢出 产生的原因: 1、使用了非类型安全的语言...函数参数、函数的局部变脸、函数执行完后返回到哪里等等 每一个栈帧代表的就是一个未运行完的函数 3、实例教学 代码如下 创建过程如下: 1、创建一个 touch hello.c 2、添加可以正确执行的...这类信息虽然不是错误,不影响编译,但是很可能是程序 bug 的源头,也有助于你寻找代码中的错误,规范代码格式。所以建议每次编译时都加上 -Wall 参数。...删除断点 删除断点通过命令包括: delete 断点id>:删除指定断点 delete:删除所有断点 clear clear 函数名 clear 行号 clear 文件名:行号 clear 文件名:函数名...查看断点 info br 简写:i b 设置断点 设置断点可以通过b或者break设置断点,断点的设置可以通过函数名、行号、文件名+函数名、文件名+行号以及偏移量、地址等进行设置。

    13010

    【Linux课程学习】:Linux的调试器-gdb的使用(常见指令,cgdb)

    ●list (文件名+:)(行号):查看行号位置的往上5行,往下5行,行号处于中间位置。 ●list (函数名):查看某个函数。 ●run:执行程序。...●until 行号:跳至多少行。 ●break(简写:b) (指定文件) +(行号):在指定文件的指定行号增加断点。 ●break(简写:b)(指定文件)(函数名):在某个函数的开头设置断点。...until 行号:跳至多少行。 断点使用 1.增加断点: 在一次调试周期中,序号只能线性递增。也就是说,如果最开始打了两个断点,他们的序号为1,2。...然后新增断点时,不管有没有删除1,2号断点,新增的断点都是从3号开始。 break(简写:b) (指定文件) +(行号):在指定文件的指定行号增加断点。...break(简写:b)(指定文件)(函数名):在某个函数的开头设置断点。 2.查看断点信息: info break(b):查看所有断点信息。

    20010

    GDB使用详解

    二、常见命令 l(list):显示代码,list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12,list 函数名:将显示“函数名”所在函数的源代码,如:list main...; b(break):设置断点,参数可以是行数,函数名,也可以用文件名:行数或者文件名:函数名; tb(tbreak):临时断点,参数和b的一样; info b(i b/info break):查看断点...,查看断点; 例:如下图,通过b设置断点,如果要为断点指定源文件,使用b helloworld.c:10(源文件名:行数或者函数名),列Num的数字123是断点序号,Disp为keep的表示为普通断点,...until:可以运行程序直到退出循环体; finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息; watch:设置一个监视点,一旦被监视的“表达式”的值改变,gdb...”,并传递“参数”,如:call gdb_test(55); layout:用于分割窗口,可以一边查看代码,一边测试; layout src:显示源代码窗口; layout asm:显示反汇编窗口;

    7.1K100

    php调试利器之phpdbg

    其实phpdbg和gdb功能有些地方非常相似。如,可以设置断点,可以单步执行,等。只是他们调试的语言不一样,gdb侧重于调试c或者c++语言,而phpdbg侧重于调试php语言。...设置断点 设置断点的命令和gdb一样。都是break,简写形式为b。不过具体的命令参数还是有所差异的。和gdb的断点命令相同之处,它们都可以“按文件名:行号” 或者 行号的方式设置断点。...除此之外,phpdbg还提供了一些针对php特有的设置断点的方式。如,根据opline设置断点,根据opcode设置断点等。 众所周知,php代码最终是解析成opcode,然后由php内核一条条执行。...按opline设置断点: 这里所说的opline,就是以方法入口作为起点,当前代码的行号。...如test_phpdgb.php文件中,第18行的代码“$param = $param + "baba";”的opline就是 2。

    1.4K10

    UNIX及UNIX-like环境下的调试工具gdb使用方法

    debug版本和release版本的区别 先从文件大小初见端倪,debug版本的文件是要比release版本的文件大的 那我们具体如何在Linux环境下调试程序呢?...首先我们需要输入这样的一个命令:gdb+可调式程序名,注意这个程序必须是以debug版本发布的,也就是需要在makefile文件中用-g进行书写。...b + 行号就是给这一行打断点 如果有多文件,我们就是文件名+行号也是可以打的 info b用来查看断点 那如何删掉断点呢? d 断点编号就是删除断点,注意这里的编号并不是行号,是断点的编号!...undisplay + 编号,取消常显示变量的内容和地址 quit就是退出gdb调试 c:从一个断点运行到下一个断点(范围查找) bt:查看调用堆栈 finish:将一个函数运行结束,就停下来(范围查找...修改一个变量的内容(不用改代码,多分枝测试) 总结: 肯定是没有VS图形化界面调试舒服,或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB

    9510

    GDB实现原理和使用范例

    一、前言 这篇文章为了让你深入了解gdb的工作原理,以及如何在linux环境下使用强大的gdb调试程序功能。 二、gdb工作原理 2.1....gdb的跟踪调试功能设置程序的断点break point,父进程通过ptrace接管子进程除了SIGKILL之外所有的信号。...*函数 , 然后退出gdb 举个比较实用的例子: 下面是非常有用的shell脚本用来查找指定函数,并在这些函数上设置断点,然后运行程序,在每次这些函数被调用的时候,打印出5层堆栈。程序结束,自动退出。...如果设置足够多的函数断点,可以打印出所有的函数调用关系,然后后处理该脚本的输出,可以得到一个函数调用图。这是一个比较快捷的方法。 最后的args 文件中需要保存运行workbinary命令的参数。...断点 b :行号>设置断点, b 在函数级别设置断点。

    5.3K10
    领券