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.youkuaiyun.com/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.youkuaiyun.com/ariessurfer/article/details/7648938
嵌入式gdb工具编译
http://blog.youkuaiyun.com/feixiang3839/article/details/41093021
信息量很大,不能完全理解: