Linux GDB学习

gdb

gcc 编译选项加上 –g ,这样生成的目标代码中就添加了调试信息。

gcc –g –o hello hello.c

redhat 6.3 默认是不安装gdb的,如果安装从系统光盘(ios镜像文件),将其解压在Packages文件夹下找到         gdb-7.2-56.el6.i686.rpm,然后执行以下命令:

rpm -ivh gdb-7.2-56.el6.i686.rpm(因为版本不同数字部分可能不同)

1. 启动GDB

指令:gdb 程序名[corefile]

corefile是可选的,但能增强gdb的调试能力

Linux默认是不生成corefile文件的,所以需要在.bashrc文件中添加一样代码   ulimit  –c unlimited    .bashrc文件在宿主目录下(修改玩.bashrc 文件后记得执行 ..bashrc让修改生效)

corefile 文件在程序运行出错的时候 保存程序的内存信息(gdb调试的是运行时候出现的错误,代码的错误由编译器负责)

先写一个有错的程序:

对其进行编译

编译器并没有报错

再看其运行的时候

由于操作了空指针,所以程序会出错,同时在当前目录下生产一个corefile文件

现在结合corefile 用gdb进行调试

加上 corefile 就可以知道错误的信息,以及发生错误的代码在哪里, 在不加上corefile的情况下,如下图

这里并没有提示错误信息,程序需要你一步一步的调试然后找到错误。

2. GDB常用命令

run

让程序直接运行,知道遇到断点或者错误

gdb能够看到程序错误的内存信息, 0x000000004004d4 表示内存地址。

where

test()函数到底出了什么问题?where命令,显示导致段错误的执行函数树

这个是函数调用的顺序,0号代表当前所在函数。1 号的意思就是 main 函数 调用了test函数所以test为零号,main为一号 函数的调用顺序通过栈来保存。

list

list[m,n] , m/n 是要显示包含错误代码出现位置的前吗m行和后n行。不带参数则显示附近十行

whatis

查询变量是什么类型 规则同print

print

gdb最有用的功能之一就是它可以显示被调试程序中任何表达式、变量的值

print变量\表达式

print  ‘file’::变量\表达式, ‘ ’是必须的,以便让gdb知道指的是一个文件名

print  funcname::变量,表达式

ptype

ptype告诉你结构的定义,注意是结构体

break

break命令设置断点:

breaklinenum

breakfuncname

breakfilename::linenum

breakfilename:funcname

额,这个可以翻译一下就理解了

infobreak 查看断点信息

continue运行到下一个断点

delete删除所有断点 , delete num 删除指定标号的断点

set variable

setvariable 改变一个变量的值

setvariable varname = value

单步调试 step next

step相比于continue step只运行行代码,并且step在遇到函数的时候会进入函数内部

next同等于step 但是不会进入函数,而是运行到下一行

return停止执行当前函数,讲value返回给调用者, step 在函数内部运行时用return跳出

时间: 2024-10-03 05:37:54

Linux GDB学习的相关文章

Linux内核学习总结

李泽源 原创作品 转载请注明出处 <Linux内核分析>MOOC课程:http://mooc.study.163.com/course/USTC-1000029000 [Linux内核学习总结] 幸福来得很突然,这门课就快结束了…… 是时候,总结下这段时间的坚持了,也给同样对Linux内核有兴趣的你一个指南. 在这门课的学习过程中,按照老师的要求,每次课后都写一篇博文,这是一个很好的学习方式.每当写这些文章的时候,总是要多看几遍视频,再查查相关的资料,才能勉强凑成一个完整的文档:同时也把自己学

Linux内核学习总结(final)

Linux内核学习总结 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这八周以来,我从拼不出来"Linux"这个词到知道了很多专有名词,也能大概了解Linux的工作机制,这一系列的进步都是一周周积累下来的.现在回过头来看,有种阳光总在风雨后的感觉,虽然这个比喻好像不太恰当. 闲话少说,接下来就进入这次的正题. 一.首先是对Linux操作系统的理解 1.操作系

Linux驱动学习步骤(转载)

1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world, insmod后应该能够通过dmesg看到输出. 5. 写一完整驱动, 加上read, write, ioctl, polling等各种函数的驱动实现. 在ioctl里完成从用户空间向内核空间传递结构体的实现. 6. 写一bl

Linux系统理解以及Linux系统学习心得

原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 说一下我对Linux系统的理解 1.加载Linux内核准备:在加载基本输入输出模块(BIOS)之后,从磁盘的引导扇区读入操作系统的代码文件块到内存中,之后开始整个系统的初始化. 2.main.c的start_kernel函数是整个操作系统的入口,这也与Linux是基于C语言的特性相符,start_kernel具体做的动作很多

谈谈我对Linux系统学习的历程回顾

众所周知,Windows 和Linux 是目前最流行的2个操作系统.Windows系统适合普通用户,它的优势是图形化界面,简单易用,使用起来门槛很低,很容易上手,所以,windows占有了大多数普通用户群体.而Linux 被誉为黑客的操作系统,因其稳定和命令行操作的高效性而广泛用于开发工作,占有绝大多数开发者群体.当然,关于这两大系统的优缺点,这里就不再赘述,我主要想谈谈我的Linux的学习历程参考书籍<Linux就该这么学>和心得体会. Linux初体验 一年前,我还不知道Linux为何物,

Linux程序设计学习笔记----网络通信编程API及其示例应用

转载请注明出处, http://blog.csdn.net/suool/article/details/38702855. BSD Socket 网络通信编程 BSD TCP 通信编程流程 图为面向连接的Socket通信的双方执行函数流程.使用TCP协议的通信双方实现数据通信的基本流程如下 建立连接的步骤 1.首先服务器端需要以下工作: (1)调用socket()函数,建立Socket对象,指定通信协议. (2)调用bind()函数,将创建的Socket对象与当前主机的某一个IP地址和TCP端口

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

Linux 程序设计学习笔记----POSIX 文件及目录管理

转载请注明:http://blog.csdn.net/suool/article/details/38141047 问题引入 文件流和文件描述符的区别 上节讲到ANSI C 库函数的实现在用户态,流的相应资源也在用户空间,但无论如何实现最终都需要通过内核实现对文件的读写控制.因此fopen函数必然调用了对OS的系统调用.这一调用在LINUX下即为open, close, read, write等函数.这些都遵循POSIX标准. so,在linux系统中是如何通过POSIX标准实现对文件的操作和目