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

gdb打印长值,监视使用rand()设置的变量

在使用 gdb 调试程序时,有时需要打印或监视长值,特别是当这些值是通过 rand() 函数设置的变量时。以下是一些基础概念和相关操作:

基础概念

  1. GDB (GNU Debugger): 是一个强大的调试工具,用于调试程序的执行流程、变量值等。
  2. rand(): 是一个标准库函数,用于生成伪随机数。

相关优势

  • 精确控制: GDB 允许你在程序执行的任何点暂停并检查状态。
  • 灵活性: 可以监视和修改变量的值,帮助理解程序行为。
  • 调试复杂问题: 对于涉及复杂逻辑或大数据结构的问题特别有用。

类型与应用场景

  • 类型: GDB 支持多种数据类型的打印,包括基本类型(int, long, float等)和复杂类型(数组、结构体等)。
  • 应用场景: 在开发过程中遇到难以复现的bug,或者需要深入了解程序内部状态时使用。

遇到的问题及解决方法

问题:如何打印长值?

假设你有一个通过 rand() 设置的长整型变量 long_val,你可以使用以下命令在 GDB 中打印它的值:

代码语言:txt
复制
(gdb) p long_val

如果 long_val 是一个非常大的数,可能需要使用格式化输出来查看完整的值:

代码语言:txt
复制
(gdb) p/x long_val  # 打印十六进制格式
(gdb) p/d long_val  # 打印十进制格式

问题:如何监视使用 rand() 设置的变量?

你可以使用 watch 命令来监视变量的变化:

代码语言:txt
复制
(gdb) watch long_val

每当 long_val 的值发生变化时,GDB 都会暂停程序执行并显示相关信息。

示例代码

假设你有以下 C 程序:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand(time(NULL));
    long long_val = rand();
    printf("Random long value: %ld\n", long_val);
    return 0;
}

编译并运行此程序:

代码语言:txt
复制
gcc -g -o test_program test_program.c
./test_program

然后使用 GDB 调试:

代码语言:txt
复制
gdb ./test_program

在 GDB 中:

代码语言:txt
复制
(gdb) break main
(gdb) run
(gdb) p long_val  # 打印 long_val 的值
(gdb) watch long_val  # 监视 long_val 的变化

注意事项

  • 确保在编译时加入了 -g 选项,以便 GDB 可以获取调试信息。
  • 如果变量值变化频繁,使用 watch 可能会导致程序多次暂停,影响调试效率。

通过上述方法,你可以有效地在 GDB 中打印和监视长值,特别是在处理通过 rand() 函数设置的变量时。

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

相关·内容

Rust之Cargo构建、运行、调试

入门教程中使用 cargo new helloworld 命令创建了一个名为 helloworld 的工程,Cargo 新建了一个名为 helloworld 的文件夹并在里面部署了一个 Rust 工程最典型的文件结构...版本的话,运行它 cargo update-p rand #运行test测试 cargo test abc #检查代码,确保能通过编译,但不产生执行文件其速度比cargo build快得多编写代码时可以反复的使用...",             "miDebuggerPath": "这里填GDB所在的目录",             "setupCommands": [                 ...{                     "description": "为 gdb 启用整齐打印",                     "text": "-enable-pretty-printing...,只需要在行号的左侧点击红点就可以设置断点,在运行中遇到断点会暂停,以供开发者监视实时变量的值。

1K20

【Linux】开始使用gdb吧!

2 开始使用 首先进入gdb直接使用:gdb 文件名 接下来我直接给出 gdb 的 所有功能命令(注意简写形式,会经常使用): list /l 行号:显示指定行号附近的源代码,每次显示10行,从当前光标位置向下滚动...finish:执行当前函数的剩余部分,直到函数返回,然后暂停程序。 print ( p ) 表达式:计算并打印表达式的值。 p 变量:打印变量的值。 set var:修改变量的值。...监视相关操作: display 变量名:跟踪指定变量的值,并在每次程序暂停时显示它。 undisplay:取消对先前设置的变量的跟踪。...info(i) locals:显示当前函数栈帧中局部变量的值。 quit:退出GDB。...gdb_test() 函数 print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数 watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序

44310
  • 使用gdb调试程序

    test的调试 gdb调试没有链接源码 gdb> set directories pathname 设置参数 方法1: (gdb)> set args xxx1 xxx2 (gdb)> show args...(vs中F11) continue #继续运行程序到下一个断点(vs中F5) until #跳出当前循环或语句块 until #继续运行到某一行 finish #跳出函数 打印\监视变量 display...变量1 #推荐这种,每步都会输出要查看的变量 print 变量或者表达式> print 地址@数字n #打印从该地址开始的n个变量,例如: print a[0]@20 watch 变量名 #监视某变量...,当变量的值发生变化时就打印该值 nb功能 set (i=0) #设置i=0 set var key=value #也可以,例如: set var i=10 print key=value #三种形式...问题原因:使用watch监视变量tmp,但是程序运行到tmp未定义的地方了. 解决方法:info watch查看变量tmp的编号,delete 就可以了.

    71410

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

    目录 一、gdb简介 二、gdb使用流程 1、启动gdb 2、查看源码 3、运行程序 4、设置断点 5、单步执行 6、查看变量 7、退出gdb 三、gdb基本使用命令 1、运行命令 2、设置断点...until+行号: 运行至某行,不仅仅用来跳出循环 finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。...gdb_test() 函数 print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数 display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后...,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。...如: display a watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。

    2.7K20

    GDB 和 CGDB的使用及理解

    通过 GDB,开发者可以: 设置断点、监控变量的值。 单步执行代码。 查看函数调用栈。 修改运行时的变量值。 安装 GDB 在 Linux 系统中,GDB 通常已经预装。...,delete watch 设置变量监视点 watch result backtrace 或 bt 查看当前调用栈 backtrace GDB 实战案例 案例 1:简单调试 代码示例(mycmd.c)...调试技巧与实战 使用 Watchpoint 监视变量 如果怀疑某个变量的值被错误修改,可以使用 watch 命令监视该变量: (gdb) watch result 程序运行时,变量 result 发生任何变化都会触发暂停...查看调用栈 如果程序崩溃或行为异常,使用 backtrace 查看函数调用栈,定位问题根源: (gdb) backtrace 快速定位问题 使用 info locals 查看当前函数的所有局部变量。...通过掌握设置断点、变量监视、条件断点、修改变量值等技巧,可以应对各种调试场景。在调试过程中,始终记住以下几点: 善用断点和条件断点:提高调试效率。 观察变量的变化:分析程序行为。

    8010

    gdb 调试笔记

    基于CPU的调试寄存器,如x86的DR0-DR7 不需要修改程序代码,可以针对EEPROM上的代码位置 有数量限制,x86上最多4个 (4)监视断点 监视表达式,值变化时中断 watch a*b +...会打印栈里的变量 五、打印和单步调试 p *&argv[0]@3:表示打印argv[0] argv[1] argv[2] p {int}argv 以int类型显示argv变量 p/x 显示十六进制 p.../m 显示源码 混合 disas start, end disas start, +length $表示上一个显示的变量 $n表示上n个显示的变量 $$表示上上个显示的变量 $$n表示上n个显示的变量的值...str2) 比较两个字符串是否相等,相等返回1 help function 查看可使用的函数 explore val :可以显示变量的类型 (1)观察类型 pt(ptype) 观察数据类型(结构) whatis...call func 执行func函数并打印返回值 return result 强制返回,返回值为result 六、实用操作 gdb 重放操作 repeat (1)启动参数 gdb ‐n :可以不加载任何

    94000

    GDB使用详解

    *注意-g,在linux下用gcc编译时,如果不加-g,编译器会进行优化,就不会生成调试信息,无法调试,也可以使用-ggdb,这是gcc为gdb提供的更详细的调试信息,别的调试器无法使用。...,查看断点; 例:如下图,通过b设置断点,如果要为断点指定源文件,使用b helloworld.c:10(源文件名:行数或者函数名),列Num的数字123是断点序号,Disp为keep的表示为普通断点,...until:可以运行程序直到退出循环体; finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息; watch:设置一个监视点,一旦被监视的“表达式”的值改变,gdb...将强行终止正在被调试的程序; frame n:移动到指定的栈帧,并打印栈的信息,n为帧编号,如果不指定n,打印当前栈的信息; set args 参数:指定运行时的参数; show args:查看设置好的参数...; show paths:查看程序运行路径;set environment varname [=value] 设置环境变量。

    7.1K100

    高级调试技巧揭秘:深入了解gdb调试正在运行的进程

    (4)一旦附加成功,可以使用gdb的其他命令来控制和观察目标进程的执行。例如,可以设置断点、单步执行、查看和修改变量的值等。设置断点:使用break或b命令来设置断点。...gdb还提供了许多其他有用的命令和功能,例如条件断点、查看堆栈信息、监视变量等。可以查阅gdb的文档或使用help命令在gdb中获取更多的帮命令信息。...例如,如果要监视名为"myVariable"的变量,可以执行以下命令当myVariable的值发生变化时,gdb会中断程序的执行,并显示相关的调试信息。...:watch myVariable还可以使用更复杂的条件来设置监视。例如,可以使用条件表达式来指定只有当变量满足某个条件时才中断程序的执行。...continue(4)打印堆栈信息:使用backtrace或bt命令来打印当前调用堆栈的信息,显示程序执行到当前位置时的函数调用链。

    55800

    Linux下GDB调试指令总结

    until+行号:运行至某行,不仅仅用来跳出循环 finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。...05 打印表达式 print 表达式(简记p): 其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用...gdb_test() 函数 print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数 display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后...,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。...如:display a watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。

    4.6K20

    猿创征文 | 【Linux】调试器-gdb使用

    finish:执行到当前函数返回,然后挺下来等待命令 print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数 p 变量:打印变量值。...display 变量名:跟踪查看一个变量,每次停下来都显示它的值 undisplay:取消对先前设置的那些变量的跟踪 until X行号:跳至X行 breaktrace(或bt):查看各级函数调用及参数...info(i) locals:查看当前栈帧局部变量的值 quit:退出gdb 这是一些指令,接下去我们通过部分指令进行演示: readelf -S 显示内部格式信息 l(显示代码) 显示全部代码...,类似于监视) until(调整值指定行) p 变量:打印变量值,set var:修改变量的值 info locals(查看当前栈帧局部变量的值) disable breakpoints:禁用断点...另外,对于gdb的使用我们应该在后期进行熟练的掌握与使用。 ---- 三、总结 至此,关于Linux环境的基本工具到这里结束。

    84220

    【Linux】GDB调试

    s ---- 监视变量 print 调试程序最基本的需求就是监视变量的值,可以使用print命令,缩写为p,显示指定变量的值。...print count watch 为了更方便的监视某一变量,使用watch,来时刻监视某一变量或表达式,只要它发生了变化,就会停下来。并给出提示。...watch count ---- 临时修改变量 set var 某些情况我们需要让程序进入一些特殊的流程,例如进入了一个循环,我们可以修改控制循环变量的值,来跳转到指定的循环次数。...gdb允许用户在程序运行时改变变量的值,通过set var命令来实现。...set var count = 4 ---- 查看堆栈情况 bt 每次调用一个函数,函数的地址、参数、以及内部变量都会被压入栈中,运行时的堆栈信息对于程序员非常重要,使用"bt"命令可以看到当前运行时栈的情况

    3.7K50

    GDB调试学习

    gdb调试 能进行GDB调试,一般在编译过程中,需使用-g参数。如果不使用-g参数,则在gdb调试过程中,将不能得到程序的函数名、变量名等信息,而只能看见运行时内存地址。...p/print:打印指定变量(临时变量和全局变量)、字符串、表达式等值。 display …:设置程序中断后想显示的数据及其格式。...set:设置变量的值。如set val = 2即为把2保存到val变量中;设置输入参数使用set args a b c(a,b,c分别为对应输入参数)。...watch:监视一个变量的值,不管它何时被改变。 rwatch:指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个命令调试。...gdb filename // 其中filename为可执行文件名 gdb filename core // core是程序core dump产生的文件,产生core文件,需设置栈大小无线使用ulimit

    1.4K20

    【Linux】调试工具gdb的使用

    ,再次进行设置,那么断点的编号就变成了2,除非退出gdb,否则一直累加。...n: 逐过程调试(不会进入函数) s: 逐语句调试(会进入函数) 监视窗口(查看变量信息)(p) 这里我用换一个简单的代码,来方便我们进行观察。...断点之间跳转(c) 我们知道vs下可以使用f5来进行断点之间的切换,gdb中也可以,命令为c(vs中的f5)(vs中使用f5都是处于调试状态下,因此gdb也是如此) 关于gdb的其它一些指令 gdb的指令还有很多...,以上主要讲了几个比较常用的,下面我将一些指令也都罗列出来,大家感兴趣的可以自己来亲自试验一下: fifinish :执行到当前函数返回,然后挺下来等待命令 print(p) :打印表达式的值,通过表达式可以修改变量的值或者调用函数...info(i) locals :查看当前栈帧局部变量的值 ---- end.

    3.4K30

    GDB的那些奇淫技巧

    通常设置为step模式可解决单步调试的问题。 程序运行 我经常用到的一个功能是需要使用 gdb 执行某个程序,并且能精确控制程序的参数,包括命令行、标准输入和环境变量等。...这在 gdb 中可以使用environment参数,不过需要注意的是该参数的设置是以空格为切分而不是传统的以=对环境变量赋值。...condition {id} {expr} 条件断点,只有在条件生效时才发生 condition 2 i == 20 2号断点只有在 i == 20 条件为真时才生效 watch {expr} 对变量设置监视点...print *$->next 打印 list print $1 输出打印历史里第一条 print ::gx 将变量可视范围(scope)设置为全局 print 'basic.c'::gx 打印某源代码里的全局变量...info display 显示监视的表达式 show values 查看记录到打印历史中的变量的值 (gdb 4.0) info history 查看打印历史的帮助 (gdb 3.5) 文件操作

    1.3K20

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

    CGDB 提供了更加直观的视图和界面,使得调试过程更为高效。 1.2 两者各自的功能 【GDB 的主要功能】 启动程序:可以在 GDB 中启动程序,设置参数和环境变量。...设置断点:允许用户在程序中的特定位置设置断点,以便程序执行到该位置时暂停。 单步调试:可以逐行执行代码,观察每一步的行为和变量的变化。...【函数压栈】 set var 修改变量的值 p(print) 变量名 打印变量值 display 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】 undisplay + 变量名编号 取消对先前设置的那些变量的跟踪...-- 直接运行程序 增加/查看/删除断点 n/s -- 逐过程/逐语句 3.3 补充 watch(监视) 执行时监视一个表达式(如变量)的值,如果监视的表达式在程序运行期间的值发生变化,GDB 会暂停程序的执行...为什么要使用gdb / cgdb 来调试 1. 强大的调试功能 GDB 功能强大:GDB 允许开发者进行单步调试、设置断点、观察变量的值、检查内存状态等。

    22310

    内核调试黑魔法:对QEMU自身进行调试,从而定位DragonOS问题

    思路 调试QEMU的方式主要有2种: 加日志打印:qemu_printf() 使用gdb调试QEMU自身 整个调试的过程,主要就是打印日志,以及使用gdb去打印寄存器/局部变量值,还有traceback...接着我们可以改qemu的代码使用qemu_printf()函数去不断的打印日志,同时在纸上画调用链。找到整个调用链。...整体流程如下: gdb通过该脚本启动 GDB加载qemu-system-xxxx作为要调试的文件 GDB设置断点 在调试脚本中,运行qemu的命令,启动虚拟机。...: gdb -x command.gdb 就能设置断点并启动虚拟机,这个时候,gdb调试的就是QEMU自身了。...监视内存地址 我们可以使用gdb的watch功能,监视QEMU的结构体的成员变量的变化,当变量发生变化时,就可以准确定位“更新状态”的代码上下文。这有助于我们对整个执行流程进行分析。

    1.5K10

    C++代码调试和测试:使用调试器和单元测试工具

    GNU GDB GDB 是 GNU 项目中的调试器,它可以在命令行环境下使用。它提供了许多功能,如设置断点、监视变量、单步执行等,可以帮助我们精确地追踪代码的执行过程并查找错误。...以下是一些常用的 GDB 命令:break:设置断点run:启动程序的执行next:单步执行print:打印变量的值watch:监视变量的变化 2....假设我们使用 GNU GDB 调试器,可以在函数中设置断点并逐步执行代码,观察变量的值和代码的执行流程。...int result = calculateSum(array, size); // 打印结果 printf("Sum: %d\n", result); return 0;}然后我们可以通过运行调试器并观察变量的值来验证函数的正确性...假设我们使用 GNU GDB 调试器,为了调试 Library 类的 findBookByTitle() 函数,我们可以在函数中设置断点并逐步执行代码,观察变量的值和代码的执行流程。

    74120

    Linux工具学习之【gdb】

    ,确保程序的每一步都被执行 查看变量 调试过程中还有一个很重要的工作:查看变量信息,如VS中的监视窗口,假设没有监视功能,那么我们可能连变量的变化情况都无法捕捉到,庆幸的是 gdb 支持监视功能 bt...,原来监视的变量就看不到了;可以看出,p 监视出的值也是有编号的,每调用一次指令,编号就会累加一次 display 常显示变量 gdb 当然也支持一直监视变量,使用指令 display 即可 (gdb)...,常显示的变量也有属于自己的编号,这个编号运行机制跟断点的一样,只要 gdb 不退出,它是会一直累加的 编号存在的主要意义就是方便我们进行监视变量删除 (gdb) undisplay 变量编号 //取消监视指定变量...(gdb) disable 断点编号 //关闭断点 能关闭当然也能打开 (gdb) enable 断点编号 //打开断点 set var 设置条件 给变量设置条件,使程序运行至设定值那一步,比如...set var i=5 后,程序就运行至 i=5 的那一步了 (gdb) set var 变量值 //设置变量值 这个功能就像VS中的给断点设置条件,然后跳转 ptype 查看变量类型 本文只是介绍了部分常用指令

    20820

    VsCode配置gdb(首次成功)

    生成了文件 打印的结果 修改task.json # 您可以tasks.json使用"{fileDirname}\\{fileBasenameNoExtension}.exe"为硬编码的文件名(例如" 调试...,然后选择“ C ++(GDB / LLDB)”。 然后,您将看到各种预定义调试配置的下拉列表。选择g ++。exe构建并调试活动文件。 该program设置指定要调试的程序。...在左侧的装订线中出现一个红点,指示已在此行上设置断点。 希望在程序执行时跟踪变量的值。您可以通过在变量上设置监视来做到这一点。 将插入点放在循环内。...在“监视”窗口中,单击加号,然后在文本框中键入word,这是循环变量的名称。现在,当您逐步执行循环时,请查看“监视”窗口。...编译器的路径# 该扩展名使用该compilerPath设置来推断C ++标准库头文件的路径。当扩展知道在哪里可以找到这些文件时,它可以提供诸如智能补全和“转到定义”导航之类的功能。

    13.9K50
    领券