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

掌握GDB调试工具,轻松排除bug

单步调试 continue(c):运行至下一个断点。 step(s):单步跟踪,进入函数,类似于VC中的step in。 next(n):单步跟踪,不进入函数,类似于VC中的step out。...rbreak: 和 break 和 tbreak 命令不同,rbreak 命令的作用对象是 C、C++ 程序中的函数,它会在指定函数的开头位置打断点。...禁用自动显示列表中处于激活状态下的变量或表达式 (gdb) enable display num......除此之外,还可以使用 info args 命令查看当前函数各个参数的值;使用 info locals 命令查看当前函数中各局部变量的值。...(gdb) backtrace [-full] [n] 用于打印当前调试环境中所有栈帧的信息 其中,用 [ ] 括起来的参数为可选项,它们的含义分别为: n:一个整数值,当为正整数时,表示打印最里层的

79400

很经典的GDB调试命令,包括查看变量,查看内存

也就是重名),一般情况下是局部变量会隐藏全局变量,也就是说,如果一个全局变量和一个函数中的局部变量同名时,如果当前停止点在函数中,用print显示出的变量的值会是函数中的局部变量的值。...四、输出格式 一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。...x命令的语法如下所示: x/ n、f、u是可选的参数。 n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。 f 表示显示的格式,参见上面。...u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。...set print address set print address on 打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。

22.5K71
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言: ---gdb查看内存和寄存器内容

    gdb没有CodeWarrior强大,但是也提供了查看寄存器的命令: (gdb) info register r1 r1 0xbffffb40 3221224256 (gdb...)来查看内存地址中的值。...x命令的语法如下所示: x/ n、f、u是可选的参数。 n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。 f 表示显示的格式,参见上面。...u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。...输出格式 一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量 的中的位的情况。

    3.4K40

    GDB入门教程之如何使用GDB启动调试

    要使得 C 和 C++ 程序能在 GDB 下正常进行调试,必须在程序编译期间把基本的调试信息(如变量名、函数名、函数调用堆栈等)添加到可执行文件中。...当使用GDB加载不包含调试信息的二进制文件或进程时,GDB终端会提示错误信息:"no debugging symbols found"。...若 demo 程序启动时需要命令行参数,则可以在使用 gdb demo 命令进入GDB后,使用命令 run arg1 arg2... 提供命令行参数并启动对demo程序的调试。...GDB 正常加载 core 文件后,便可以使用 backtrace (缩写形式 bt) 显示程序异常退出时刻的函数堆栈情况,再使用 frame、 print、 up、 down、 where 等命令对异常现场进行详细分析...为了让程序产生 dump ,将 demo.cpp 中的输出语句 printf("%s: %d\n",(char*)ptr,array[i]); 改成 printf("%s: %s\n",(char*)ptr

    4.4K10

    GDB调试

    clear :和break命令对应的反操作,根据位置清除断点,不指定参数则清除所有断点。...),GDB提供了相应的命令来显示和查找源代码。...显示源码: list [list_args]:list(l)显示源代码,list_args类似break中的break_args参数,可以是行号,函数等,详细参考help list。...signal :给程序产生一个信号signal和handle命令中参数意义相同 强制函数返回: return []:强制函数返回,如果提供了expression则会当做返回值...问题二:段错误 写C、C++代码最常见的问题是对内存的不当处理,最常见的莫过于段错误,典型的如访问不存在的内存地址、访问了不允许访问的地址(试图往只读的位置写数据)。常见产生的原因:1.

    2.2K10

    Linux 命令(143)—— valgrind 命令

    本文主要提供了使用 Memcheck 检测程序中的内存错误所需的最少信息。 有关 Memcheck 和其他工具的完整文档,请阅读用户手册。...这通常很重要,因为在某些环境中,使用不匹配的函数释放可能会导致崩溃。 然而,有一种情况是无法避免这种不匹配的。...4.3 内存覆盖 C 语言的强大和可怕之处在于其可以直接操作内存,C 标准库中提供了大量这样的函数,比如 strcpy, strncpy, memcpy, strcat 等,这些函数有一个共同的特点就是需要设置源地址...12) 输出结果显示上述程序中第 12 行,源地址和目标地址设置出现重叠。...4.5 内存申请与释放函数不匹配 内存申请与释放函数不匹配,如 C++ 程序中使用 malloc 申请内存,但错误地使用 delete 去释放,那么 Valgrind 也可以检测出来。

    3.3K40

    PWN从入门到放弃(8)——格式化字符串漏洞

    0x00 格式化字符串函数介绍 格式化字符串函数可以接受可变数量的参数,并将第一个参数作为格式化字符串,根据其来解析之后的参数 0x01 格式化字符串函数 输入 scanf 输出 printf 输出到...以下几个 pattern 中的对应选择需要重点关注 parameter n$,获取格式化字符串中的指定参数 flag field width 输出的最小宽度 precision 输出的最大长度 length...,输出的长度 hh,输出一个字节 h,输出一个双字节 type d/i,有符号整数 u,无符号整数 x/X,16 进制 unsigned int 。...c,如果没有用 l 标志,把 int 参数转为 unsigned char 型输出;如果用了 l 标志,把 wint_t 参数转为包含两个元素的 wchart_t 数组,其中第一个元素包含要输出的字符,...程序获取我们两次输入,并且将我们的输入打印出来,还会显示一些奇奇怪怪的东西 3)分析程序&查找漏洞点 将程序扔到ida pro里分析 main()函数调用了vuln()函数,很明显的提示,漏洞就在这里

    85110

    Linux下gdb的安装及使用入门

    -g -o选项的作用是:对命令输出结果进行导入操作,这里是把gcc –o a a.c -g的操作结果输出到文件a(文件名可以自定义)中进行保存。...(gdb) 如下图所示: ? gdb提供一个类似Shell的命令行环境,上面的(gdb)就是提示符,在提示符后面输入gdb的相应命令就可以实现其对应的功能。...b 8是breakpoint  8的简写(breakpoint的参数也可以以是某个函数名,表示在此函数处设置一个断点),表示在程序第八行设置一个断点。...[8] 段错误   如果程序运行时出现段错误,用gdb可以很容易定位到究竟是哪一行引发的段错误。在gdb中运行,遇到段错误会自动停下来,这时可以用命令查看当前执行到哪一行代码了。   ...gdb显示段错误出现在 _IO_vfscanf 函数中,用bt命令可以看到是哪一个函数调用了它。

    6.7K10

    Linux设备驱动程序(四)——调试技术

    栈溢出的确切信号是不包含任何合理的反向跟踪信息的 oops 清单。第一个选项将在内核中增加明确的溢出检查;而第二个选项将让内核监视栈的使用,并通过 SysRq 按键输出一些统计信息。...当优先级小于 console_loglevel 这个整数变量的值,消息才能显示出来,而且每次输出一行(如果不以newline字符结尾,则不会输出)。...strace 命令是一个功能非常强大的工具,它可以显示由用户空间程序所发出的所有系统调用。它不仅可以显示调用,而且还能显示调用参数以及用符号形式表示的返回值。...strace 有许多命令行选项,其中最为有用的是下面几个: -t,该选项用来显示调用发生的时间; -T,显示调用所花费的时间; -e,限定被跟踪的语用类型; -0,将输出重定向到一个文件中 默认情况下,...**在 /proc 文件系统中执行 read 系统调用时,它会映射到一个用于数据生成而不是数据读取的函数上;。在 gdb 的使用中可以通过标准 gdb 命令查看内核变量。

    1K41

    C语言:---gdb多线程调试

    passnoignore 当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序来处理。...A、查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。...frame f n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。...E、强制调用函数 call 表达式中可以一是函数,以此达到强制调用函数的目的。并显示函数的返回值,如果函数返回值是void,那么就不显示。...比如一些GDB命令需要用到表达式或变量时,这些表达式或变量的语法,完全是根据当前的语言环境而改变的。例如C/C++中对指针的语法是*p,而在Modula-2中则是p^。

    2.2K20

    日志录入之旅:深入了解程序日志的编写和执行

    fclose()函数也可能失败,并为例程close()、write()或fflush()指定的任何错误设置errno。 注意: 请注意,fclose()只刷新C库提供的用户空间缓冲区。...函数ferror()测试stream指向的流的错误指示符,如果设置了该指示符,则返回非零。错误指示器只能通过clearer()函数重置。 函数fileno()检查参数stream并返回其整数描述符。...错误: 这些函数不应失败,也不应设置外部变量errno。(但是,如果fileno()检测到其参数不是有效的流,则必须返回-1并将errno设置为EBADF。)...当输出流未缓冲时,信息在写入目标文件或终端时立即显示;当它被块缓冲时,许多字符被保存并写入一个块;当它是行缓冲字符时,将一直保存到输出换行符或从连接到终端设备的任何流(通常是stdin)读取输入为止。...其他函数不返回值。 二、fwrite与write的关系 fwrite()是C语言中的文件流,应用层的库接口,而write()是系统接口,fwrite()最终会调用write()将数据写入磁盘。

    10900

    Linux下GDB调试指令总结

    call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55) quit(简写q) : 退出gdb 02 设置断点: break n (简写b n):在第n行处设置断点...list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12 list 函数名:将显示“函数名”所在函数的源代码,如:list main list :不带参数,将接着上一次 list...命令的,输出下边的内容。...print a:将显示整数 a 的值 print ++a:将把 a 中的值加1,并显示出来 print name:将显示字符串 name 的值 print gdb_test(22):将以整数22作为参数调用...; bt backtrace 显示当前调用堆栈 up/down 改变堆栈显示的深度 set args 参数:指定运行时的参数 show args:查看设置好的参数 info program:来查看程序的是否在运行

    4.6K20

    【gdb调试】在ubuntu环境使用gdb调试一棵四层二叉树的数据结构详解

    整体思路 在案例中我使用c语言编写了一个简单的四层二叉树进行 GDB 调试练习。这个程序故意在后面引发了一个段错误,导致程序崩溃。文章将使用 GDB 来诊断这个问题。 2....这段输出是在 GDB 中设置断点的结果: (gdb): 这是 GDB 的提示符,表示它正在等待用户输入命令。...buildTree () at tree3_01.c:26: 这行显示了当前所在的函数是buildTree以及函数参数为空。...) at tree3_01.c:58 58 *ptr = 10; // 这里将会产生段错误 这个输出是 GDB 在程序运行时遇到段错误时所提供的信息: Program received...0x00005555555553d7 in main () at tree3_01.c:58: 这部分提供了造成段错误的代码位置信息。

    12510

    这篇文章不知道起什么名字

    :显示目标机器特定的命令行选项 –version:显示gcc版本号和版权信息 -E:只进行预处理,不编译 -S:只编译,不汇编 -c:只编译、汇编,不链接 -pipe:使用管道代替临时文件 -combine...:将多个原文件一次性传递给汇编器 -g:包含调试信息 -I:指定include包含文件的搜索目录 -o:输出成指定文件名 -v:详细输出编译过程中所采用的每一个选项 -ggdb:在可执行文件中包含GDB...生成的规则可以是单行,但如果太长,就用’/’换行符连续成多行。规则显示在标准输出,不产生预处理过的C程序 -C:告诉预处理器不要丢弃注释。...-mregparm=num:当传递整数参数时,控制所使用寄存器的个数。...share_lib.so share_lib.c生成动态库文件share_lib.so 编写C头文件share_lib.h,写入函数的原型声明 编写主函数app.c,引入头文件share_lib.h,然后就可以调用在动态库中自定义的函数

    74030

    一个编译参数引发的血案

    = 1 dtor 分析过程 这段代码很简单,就是输入一个短整数,取它的绝对值并存入结构体的低10位中,如果短整数是负的,将整个结构体作为一个整数取负值保存。...读取的时候做对应转换把原值输出。 首先用gdb单步跟踪了一下,发现set执行完毕后存储的值为1。 (gdb) p foo....用不带-O2参数的版本查看了一下,输出是正确的: (gdb) p foo....,而且second已经显示是-1,应该是能进入判断里面执行的。    ...原来,因为代码不规范,编译时有好多告警,当初处理的时候添加了参数-Wno-strict-aliasing,这个参数仅仅是把警告给消除了,并没有取消这个假定条件的优化,正确的做法是使用参数-fno-strict-aliasing

    88221

    gdb基础命令和常用操作补充

    三、gdb常用操作补充 1. ulimit -c unlimited; 调试core文件 bt/where/info s 显示函数调用堆栈 up n 向调用链根部移动n个函数 down n 向调用链叶部移动...在gdb中表示寄存器名时前面要加个$,例如p $esp可以打印esp寄存器的值,如esp寄存器的值是0xbff1c3f4,所以x/20 $esp命令查看内存中从0xbff1c3f4地址开始的20个32位数...启动和查看程序 setargs 设置程序运行参数 run运行程序,使用方式如:r   List  显示程序源代码命令,使用show listsize 查看显示代码的行数   list gdb) call test("abc") 使用 "--tui" 参数,可以在终端窗口上部显示一个源代码查看窗。...’s -g and -O are orthogonal 经验:如果某个函数的局部变量发生访问越界,有可能并不立即产生段错误,而是在函数返回时产生段错误。

    3.2K00

    Linux系统下gdb调试(一)

    程序员也可以使用gdb来跟踪程序中的错误,从而减少了程序员的工作量。...主 过程 之前这取决于使用的语言来编写你的程序。例如,在c++中,用于静态和全局的构造函数,对象在调用main之前执行。因此,有可能调试器在到达主过程之前停止。然而,临时断点将保留以停止执行。...指定要给程序的参数作为“start”的参数命令。这些参数将被原原本本地提供给底层的“run”命令。注意,如果没有参数,则重用相同的参数在随后调用' start '或' run '时提供。...第14行中的代码为“n = 1”,恰好是 main 函数中的第一个可执行语句(前面的“int n;”为变量定义语句,并非可执行语句)。...的值应该是 88;再一次执行“c”命令,程序将中断于第三个断点(5行,tempFunction 函数开头处),此时tempFunction 函数的两个参数 a、b 的值应分别是 1 和 2。

    4.5K10

    【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情

    每个函数通常接受一个字符串参数args和一个整数参数from_tty,这表示命令的来源是否是终端。...这个函数使用add_cmd函数将命令添加到调试器的命令列表中。...其他: 其他函数如display_help_command、switch_heap_command、info_local_command等提供了调试器环境中的其他功能或设置。 2....这里也反馈了一个信息:地址传递给 args,通过变量 args 成功将 root 的地址设置成了传递的地址【用户传递参数的处理过程是没问题的】,显示段错误是因为这个传递的地址空间未开辟。...3.2 自定义gdb指令错误纠察 纠错思路:使用gdb调试修改的gdb进行查错,由于gdb中没有构建一颗完整的二叉树,所以我打算手动开辟一棵两层的二叉树用作测试。

    23610
    领券