使用 GDB 调试 Linux 软件
作者:dio
email: hao@peng.com.cn
日期:8/21/2001 1:00:47 PM
内容:
编译
运行 gdb
调试会话示例
使用断点
更多断点和观察点
Core 文件
堆栈跟踪
连接到其它进程
其它小技巧
结束语
参考资料
关于作者
GNU 调试器简介
作者:David Seager
Linux 的大部分特色源自于 shell 的 GNU 调试器,也称作 gdb。gdb 可以让您查看程序的内部结构、打印变量值、设置断点,以及单步调试源代码。它是功能极其强大的工具,适用于修复程序代码中的问题。在本文中,我将尝试说明 gdb 有多棒,多实用。
编译
开始调试之前,必须用程序中的调试信息编译要调试的程序。这样,gdb 才能够调试所使用的变量、代码行和函数。如果要进行编译,请在 gcc(或 g++)下使用额外的 -g 选项来编译程序:
gcc -g eg.c -o eg
运行 gdb
在 shell 中,可以使用 gdb 命令并指定程序名作为参数来运行 gdb,例如 gdb eg;或者在 gdb 中,可以使用 file 命令来装入要调试的程序,例如 file eg。这两种方式都假设您是在包含程序的目录中执行命令。装入程序之后,可以用 gdb 命令 un 来启动程序。
调试会话示例
如果一切正常,程序将执行到结束,此时 gdb 将重新获得控制。但如果有错误将会怎么样?这种情况下,gdb 会获得控制并中断程序,从而可以让您检查所有事物的状态,如果运气好的话,可以找出原因。为了引发这种情况,我们将使用一个示例程序:
代码示例 eg1.c
#include
int wib(int no1, int no2)
{
int result, diff;
diff = no1 - no2;
result = no1 / diff;
return result;
}
int main(int argc, char *argv[])
{
int value, div, result, i, total;
value = 10;
div = 6;
total = 0;
for(i = 0; i < 10; i++)
{
result = wib(value, div);
total += result;
div++;
value--;
}
printf("%d wibed by %d equals %dn", value, div, total);
return 0;
}
这个程序将运行 10 次 for 循环,使用 wib() 函数计算出累积值,最后打印出结果。
在您喜欢的文本编辑器中输入这个程序(要保持相同的行距),保存为 eg1.c,使用 gcc -g eg1.c -o eg1 进行编译,并用 gdb eg1 启动 gdb。使用 un 运行程序可能会产生以下消息:
Program received signal SIGFPE, Arithmetic exception.
0x80483ea in wib (no1=8, no2=8) at eg1.c:7
7 result = no1 / diff;
(gdb)
g
相关文档:
version: 1.0
date:20090721
Author:crifan
Mail:green-waste(At)163.com
上接:【简介】如何编写linux下nand flash驱动-1
http://green-waste.blog.163.com/blog/static/3267767820096221127554/
【读(read)操作过程详解】
以最简单的read操作为例,解释如何理解时序图,以及将时序图
中的要求,转化 ......
1.为什么要编译Linux 内核
众所周知,Linux是开放源码的操作系统,开放源码软件带给我们这计算机水平相对落后的人群的最大好处,就是可以快速学习世界高水平的程序(体系结构及编程方法等等),从而快速提高自身水平。然而这本身,也使多数开放源码软件在编码易用性、针对性方面比不上Microsoft等专业软件公司的产品。使用开 ......
最近一段时间在linux下用C做一些学习和开发,但是由于经验不足,问题多多。而段错误就是让我非常头痛的一个问题。不过,目前写一个一千行左右的代码,也很少出现段错误,或者是即使出现了,也很容易找出来,并且处理掉。
那什么是段错误?段错误为什么是个麻烦事?以及怎么发现程序中的段 ......
Linux驱动学习记录 devfs_mk_cdev
< type="text/javascript">
2.4内核注册驱动要用:
int register_chrdev (unsigned int major, const char *name, struct file_operations *fops);
2.4内核注销驱动要用:
int unregister_chrdev( unsigned int ......
分析了嵌入式环境中YAFFS/YAFFS2文件系统的优点,提出YAFFS2不仅支持小容量的NAND flash,对大容量NAND flash更具有优势。并介绍了YAFFS/YAFFS2文件系统结构。着重将YAFFS2文件系统在嵌入式Linux系统中的实现过程包括配置、编译以及测试整个完整过程作了详细的论述。
关键词 NAND flash,YAFFS/YAFFS2,嵌入式Linux系统
......