| 用GDB调试 GCC 程序 | ||||||||||||||||||||||||||||||||||||
| 2004-07-13 Rick McMullin 点击: 28 | ||||||||||||||||||||||||||||||||||||
gdb 应用举例 本节用一个实例教你一步步的用 gdb 调试程序. 被调试的程序相当的简单, 但它展示了 gdb 的典型应用. 下面列出了将被调试的程序. 这个程序被称为 greeting , 它显示一个简单的问候, 再用反序将它列出.
用下面的命令编译它: gcc -o test test.c 这个程序执行时显示如下结果: The string is hello there The string printed backward is 输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的. 我们所设想的输出应该是: The string printed backward is ereht olleh 由于某些原因, my_print2 函数没有正常工作. 让我们用 gdb 看看问题究竟出在哪儿, 先键入如下命令: gdb greeting 注意: 记得在编译 greeting 程序时把调试选项打开. 如果你在输入命令时忘了把要调试的程序作为参数传给 gdb , 你可以在 gdb 提示符下用 file 命令来载入它: (gdb) file greeting 这个命令将载入 greeting 可执行文件就象你在 gdb 命令行里装入它一样. 这时你能用 gdb 的 run 命令来运行 greeting 了. 当它在 gdb 里被运行后结果大约会象这样:
这个输出和在 gdb 外面运行的结果一样. 问题是, 为什么反序打印没有工作? 为了找出症结所在, 我们可以在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码: (gdb) list (gdb) list (gdb) list 技巧: 在 gdb 提示符下按回车健将重复上一个命令. 第一次键入 list 命令的输出如下:
如果按下回车, gdb 将再执行一次 list 命令, 给出下列输出:
再按一次回车将列出 greeting 程序的剩余部分:
根据列出的源程序, 你能看到要设断点的地方在第24行, 在 gdb 命令行提示符下键入如下命令设置断点: (gdb) break 24 gdb 将作出如下的响应: Breakpoint 1 at 0x139: file greeting.c, line 24 (gdb) 现在再键入 run 命令, 将产生如下的输出:
你能通过设置一个观察 string2[size - i] 变量的值的观察点来看出错误是怎样产生的, 做法是键入: (gdb) watch string2[size - i] gdb 将作出如下回应: Watchpoint 2: string2[size - i] 现在可以用 next 命令来一步步的执行 for 循环了: (gdb) next 经过第一次循环后, gdb 告诉我们 string2[size - i] 的值是 `h`. gdb 用如下的显示来告诉你这个信息:
这个值正是期望的. 后来的数次循环的结果都是正确的. 当 i=10 时, 表达式 string2[size - i] 的值等于 `e`, size - i 的值等于 1, 最后一个字符已经拷到新串里了. 如果你再把循环执行下去, 你会看到已经没有值分配给 string2[0] 了, 而它是新串的第一个字符, 因为 malloc 函数在分配内存时把它们初始化为空(null)字符. 所以 string2 的第一个字符是空字符. 这解释了为什么在打印 string2 时没有任何输出了. 现在找出了问题出在哪里, 修正这个错误是很容易的. 你得把代码里写入 string2 的第一个字符的的偏移量改为 size - 1 而不是 size. 这是因为 string2 的大小为 12, 但起始偏移量是 0, 串内的字符从偏移量 0 到 偏移量 10, 偏移量 11 为空字符保留. 为了使代码正常工作有很多种修改办法. 一种是另设一个比串的实际大小小 1 的变量. 这是这种解决办法的代码:
| ||||||||||||||||||||||||||||||||||||
相关推荐
linux_GDB调试学习(调试运行、多文件设置断点)_C/C++程序调试
linux下C/C++程序调试,GDB安装:sudo apt-get install gdb 使用编译器(gcc/g++)的 -g 参数可以做到这一点。如:gcc -g hello.c -o hello 启动GDB命令:gdb program 运行程序参数set args #可指定运行时参数。(如:set args 10 20 30 40 50 )show args #命令可以查看设置好的运行参数。run #运行程序,跑到断点出停止,简写(r) start #运行程序,开始只执行一步break #设置断点
系统编程--gcc编译与gdb调试工具
以上是gcc编译的四步骤,每个步骤生成对应的文件。
如何用gdb调试gcc的各个执行过程(支持调试lto)
如何调试gcc的lto,这是一个chatgpt和Bing都不知道答案的问题,经过我几天的尝试终于成功了,步骤如下。-save-temps则保留编译过程中生成的临时文件以备调试时使用。其中主要的临时文件生成在当前目录。–verbose选项输出的这个文件记录了gcc编译的整个过程。如果我们要调试预处理后的编译过程,那我们在gdbfile中找到。大部分cc开头的临时文件则在/tmp(绝对路径)文件夹下。将.i文件编译成.s文件的那一行,生成的gdbfile文件如下。如果要调试lto过程,则找到。
gcc命令以及GDB调试选项
gcc命令以及GDB调试选项
vim简单使用、gcc编译器使用与gdb调试、makefile使用
gcc的使用、gdb调试、makefile文件命令使用以及vim编辑器使用
使用GCC与GDB对c语言程序进行调试
在使用 GCC 编译源代码时添加-g选项,这会让编译器在生成的可执行文件中包含丰富的调试信息,例如源代码行号、变量名、函数名等,帮助 GDB 建立源代码和机器代码之间的映射关系。
g++ gcc 结合gdb调试运行程序
g++ gcc 结合gdb调试运行程序 2008年10月29日 星期三 下午 12:03 gdb 应用举例 本节用一个实例教你一步步的用 gdb 调试程序. 被调试的程序相当的简单, 但它展示了 gdb 的典型应用. 下
用 gdb 调试 GCC 程序
用 gdb 调试 GCC 程序 Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: 它使你能监视你程序中变量的值. 它使你能设置断点以使程序在指定的代码行上停止执行. 它使你能一行行的执行你的
Linux gcc和gdb程序调试用法
Linux gcc和gdb程序调试用法 gcc一般调试格式: gcc -Wall -o test test.c // -wall 显示程序错误详细信息 gcc -v // 显示gcc的版本 gcc -o{1,2,3} test test.c // 1,2,3三个级别的优化,优化级别越高编译的时间越长 gcc -ggdb3 -Wall -o test
gdb 调试 GCC 程序
<br />转]用 gdb 调试 GCC 程序热1佰锐科技2009-03-06 23:20 经常有朋友询问如何调试ffmpeg、ffserver等程序,因为很难使用VC++等集成开发环境来编译ffmpeg、ffserver等程序,所以调试对普通开发人员来说就很成问题了。 其实在Linux、MinGW、CygWin等环境下,均可以使用gdb调试工具来调试程序,这儿就转一篇相关的文章,供大家参考,用gdb调试ffmpeg、ffserver等程序虽然不如VC++等集成开发环境方便,但用习惯之后感觉
Linux下使用gcc和gdb调试程序
1. gcc 1> 编译动态链接库 gcc -shared hello.c -o libhello.so 2>编译主程序文件 gcc -g -rdynamic -o main main.c -ldl -ldl:显式加载动态库的动态函数库。 动态库的动态库函数包括:dlopen()、dlclose()、dlerror()、dlsym()。 当主程序在调用动态库时使用的是动态...
在Linux中用gdb调试GCC程序
在Linux中用gdb调试GCC程序 作 者: Rick McMullin Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: 它使你能监视你程序中变量的值. 它使你能设置断点以使程序在指定的代码行上停
用gdb 调试GCC 程序
用gdb 调试GCC 程序 Linux 包含了一个叫gdb 的GNU 调试程序。gdb 是一个用来调试C 和C++ 程序的强 力调试器。它使你能在程序运行时观察程序的内部结构和内存的使用情况。以下是gdb 所 提供的一些功能: l 它使你能监视你程序中变量的值。 l 它使你能设置断点以使程序在指定的代码行上停止执行。 l 它使你能一行行的执行你的代码。 在命令行上键入gdb 并按回车
【Linux】Linux程序编译(gcc编译和gdb调试)
一、gcc使用 1.gcc简介 gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。 gcc是GNU编译器套件(GNU Compiler Collection),它包括了C、C++、Objective-C、Fortran、Java、Ada、Go语言和D语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是
gcc程序编译和gdb程序调试的基本选项
GCC程序编译 基本格式:gcc [options] [filename] -o 输出可执行文件,如果不给出这个选项,则默认输出a.out可执行文件;如:gcc hello.c -o hello -c 只编译,不连接为可执行文件,生成为以.o为后缀名的目标文件;如:gcc -c hello.c -S 只激活预处理和编译,就是指把文件编 译成为汇编代码。如:gcc -S hello.c
3509




被折叠的 条评论
为什么被折叠?



