Linux GCC与GDB调试

时间:2021-10-15 05:56:47

1.gcc

如果加-c选项仅编译(compile),只会生成xxx.o
		gcc -c main.c
		gcc -c main.c -o main.o
如果加上-o选项,则生成可执行文件
		gcc -o main.out main.o #将main.o链接成可执行文件main.out 
		gcc -o main.out main.c #将main.c链接成可执行文件main.out 
如果加上-Wall 选项,可以自动提示一些出错警告的信息
		gcc -Wall -o main.out main.c

如果加-g选项(默认g2,可选g1~g3),主要用于与GDB的调试(可显示函数名 行号等)

-g1:与g2相比,没有局部变量及行号

-g2或g(默认):调试信息包含行号、扩展的符号表、局部或外部变量信息

-g3:与g2相比,增加源代码中的定义的宏

		gcc -g2 test.c -o test_coredump  #g2等级
		gcc test.c -o test_coredump      #关闭调试开关	

2.gdb

下载源码gdb-7.11.tar.gz:http://ftp.gnu.org/gnu/gdb/
解压:tar zxvf gdb-7.11.tar.gz
配置编译条件:./configure --host=arm-arago-linux-gnueabi --enable-shared --prefix=/mnt/hgfs/Share/work/gdbbin CC=arm-arago-linux-gnueabi-gcc 
                --host:交叉编译工具链前缀
                --enable-shared    动态编译
                --prefix    bin安装目录
                CC 交叉编译工具xxx-gcc

编译&安装:make&make install
                --host:交叉编译工具链前缀
                --enable-shared    动态编译
                --prefix    bin安装目录
                CC 交叉编译工具xxx-gcc
最后将生成的gdb二进制文件复制到嵌入式开发板中即可

3.配置文件系统生成core文件

     step1:busybox制作文件系统时,使能coredump功能
            FEATURE_INIT_COREDUMPS [=y]
     step2:嵌入式开发板配置
        a.查看coredump选项是否打开 #ulimit -a
            time(seconds)        unlimited#无限制
            file(blocks)         unlimited
            data(kb)             unlimited
            stack(kb)            8192     #指定大小 8192Kb
            coredump(blocks)     0        #关闭不产生core文件     
            memory(kb)           unlimited
            locked memory(kb)    64
            process              1980
            nofiles              1024
            vmemory(kb)          unlimited
            locks                unlimited
         b.关闭core文件生成 #ulimit -c 0
         
         c.使能core文件生成, #ulimit -c unlimited
         d.配置core文件输出路径及文件名
            设置proc/sys/kernel/core_pattern文件可以改变文件名及存储路径
            如:echo "/home/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
            core-文件名-pid-时间戳
            其他参数:
            %p - insert pid into filename 添加pid
            %u - insert current uid into filename 添加当前uid
            %g - insert current gid into filename 添加当前gid
            %s - insert signal that caused the coredump into the filename 添加导致产生core的信号
            %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
            %h - insert hostname where the coredump happened into filename 添加主机名
            %e - insert coredumping executable name into filename 添加命令名

*没生成coredump的原因:

1.文件大小限制,可用ulimit -a产看

2.进程退出所产生的信号不产生core文件

3.进程退出成为了僵尸进程

4.gdb使用方法

应用测试1---程序异常分析
step1:正常编译,运行程序 (程序异常时会产生core-dump文件)
step2:gdb [可执行程序] core-file     #example :gdb test.out Core_test.out_xxxx
step3:bt                             #查看函数调用及参数 
			(gdb) bt 
			#0  0x00008470 in core_test () at main.c:8
			#1  0x00008494 in main () at main.c:14


应用测试2---单步调试
step1:gdb [可执行程序]

step2:start     #开始运行程序


查看所用线程堆栈信息: thread apply all bt 



参考:

Makefile的三个变量$@ $^ $<
https://my.oschina.net/u/1413984/blog/199029
GCC优化级别及GDB调试级别:
http://www.360doc.com/content/11/1204/22/532901_169714672.shtml
用GDB调试程序(跟我一起写MakeFile作者陈皓):

http://blog.csdn.net/haoel/article/details/2879

GDB官网文档:
https://www.gnu.org/software/gdb/documentation/
使用GDB进行嵌入式远程调试:
http://www.cnblogs.com/lidabo/p/5645655.html
LINUX core dump详解 & GDB调试
http://blog.csdn.net/ariessurfer/article/details/7648938

嵌入式gdb工具编译

http://blog.csdn.net/feixiang3839/article/details/41093021


信息量很大,不能完全理解:

gdb-example-ncurses (翻译文章