(有的时分履行环境的权限真的是很重要的)
gdb-6.6运用了autoconf/automake,因而经过设置configure脚本的–target,–host,–prefix参数就能够便利的移植到其他渠道。
–target指定编译后的文件针对的是什么方针板,一般设置为穿插编译器的前缀,比方–target=arm-linux, –target=mips-linux,–target=armv5-linux-uclibc, –target的缺省值为i386-linux, 也便是PC机。
–host指定编译后的文件的运转环境,取值可所以i386-linux或许穿插编译器的前缀,缺省为i386-linux,
–prefix指定要装置的目录。
1、到http://www.gnu.org/software/gdb下载gdb-6.6.tar.gz到/tmp解压到/opt下
#cd /opt
#tar xzvf /tmp/gdb-6.6.tar.gz
2、树立装备文件、编译
gdb答应把编译装备和编译成果放到恣意的目录,因而能够在gdb目录之外树立一个专门放编译文件的目录。
#cd /opt
#mkdir -p arm-gdb/build
#cd arm-gdb/build
#/opt/gdb-6.6/configure –host=i386-linux –target=armv5-linux-uclibc –prefix=/opt/arm-gdb
#make
#make install
其间:host指定了运转环境为i386机器,target指定了需求调试的方针机环境(我运用的ARM toolchain是armv5-linux-uclibc-gcc,因而这样指定,如果是用arm-linux-gcc,则 –target=arm-linux),prefix指定了编译后的成果寄存的方位,也便是装置目录。
如果在编译arm-linux-low.c这个文件时提示找不到“sys/reg.h”, 则修正arm-linux-low.c,注释掉#include “sys/reg.h”。
能够在/opt/arm-gdb/bin下找到可履行的armv5-linux-uclibc-gdb, armv5-linux-uclibc-gdbtui, armv5-linux-uclibc-run。
3、gdbserver的移植
gdbserver要用到gdb源码目录下的一些头文件,因而无法在gdb源码目录之外树立编译文件。
#cd /opt/gdb-6.6/gdb/gdbserver
#vi build.arm
内容如下:
./configure –target=armv5-linux-uclibc –host=armv5-linux-uclibc –prefix=/opt/arm-gdb/gdbserver
make
make install
#chmod +x build.arm
#./build.arm
留意:此处target参数和host参数都要设置为armv5-linux-uclibc,由于gdbserver是放在方针板上运转的。
编译后,能够在/opt/arm-gdb/gdbserver/bin下找到armv5-linux-uclibc-gdbserver,下载该文件到方针板偏重命名为gdbserver,
一起要下载gdbserver需求的库文件libthread_db-x.x.x.so,再树立两个符号链接libthread_db.so和libthread_db.so.1。
4、运用gdbserver
在方针板上运转gdbserver
#./gdbserver 192.168.0.2:2345 hello
其间192.168.0.2为方针板的IP,能够写localhost,也能够不写。2345为gdbserver翻开的端口,能够自己设置。
#./gdbserver :2345 hello
在宿主机上运转
#armv5-linux-uclibc-gdb hello
(gdb)target remote 192.168.0.2:2345
(gdb)b main
(gdb)continue
运用X-Windows下的DDD
#ddd –debugger armv5-linux-uclibc-gdb
在DDD的GDB终端操控窗口中健入:
(gdb) target 192.168.0.2:2345
6、问题
移植的gdbserver能够和Host上的mips-linux-gdb连接上,可是run的时分gdbserver呈现
Killing inferior过错
解决方法:由于履行完target指令后,方针板程序已经在运转,一切应该用continue指令而不是run指令。
7、附1:GDB的根本指令:
load:装入一个程序
symbol-file:装入符号库文件,可所以用-g参数编译的可履行文件。
f(ile):指定一个可履行文件进行调试,gdb将读取些文件的调试消息,如f a.exe
l(ist):列程序出源文件
r(un) :装载完要调试的可履行文件后,能够用run指令运转可履行文件
b(reak):设置断点(break point),如b 25,则在源程序的第25行设置一个断点,当程序履行到第25行时,就会发生中止;也能够运用b funcname,funcname为函数的称号,
当程序调用些函数时,则发生中止
c(on
p(rint):输入某个变量的值,如程序界说了一个int aa的便是,p aa就会输出aa的当时值
n(ext):程序履行到断点时中止履行,能够用n指令进行单步履行
s(tep):程序履行到断点时中止履行,能够用s指令进行单步履跋涉某一函数
q(uit):退出GDB
8、附2:调试驱动程序和同享库
(1)调试LKM(Loadable Kernel Module)
.在方针板上刺进模块并输出map信息,检查.text进口地址:
#insmod -m hello.ko > map
#grep .text map
比方为0xc68c0060
.在gdb中转入LKM的调试信息:
(gdb) add-symbol-file hello.ko 0xc68c0060 /*留意有必要是LKM .text的进口地址)
.正常调试
(2)调试同享库
.样例程序:
test.c:
#include
int test(int a, int b)
{
int s = a b;
printf(“%d\n”, s);
return s;
}
main.c:
#include
extern int test(int a, int b);
int main(int argc, char* argv[])
{
int s = test(10, 20);
return s;
}
Makefile:
all: so main
so:
armv5-linux-uclibc-gcc -g test.c -shared -o libtest.so
main:
armv5-linux-uclibc-gcc -g main.c -L./ -ltest -o test.exe
clean:
rm -f *.exe *.so
.编译并设置环境变量
#make
在方针板上:
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
#gdbserver localhost:2345 ./test.exe
.运转gdb客户端
#armv5-linux-uclibc-gdb
(gdb)symbol-file test.exe
(gdb)target remote 192.168.0.2:2345
(gdb)b main
(gdb)c
.检查libtest.so的代码在内存中的方位。
(从gdbserver的输出或许用ps能够得到test.exe的进程ID,这儿假定PID是11547)
在方针板上:
#cat /proc/11547/maps
输出:
………
0076a000-0076c000 rwxp 0076a000 00:00 0
00bbe000-00bbf000 r-xp 00bbe000 00:00 0
00fcc000-00fcd000 r-xp 00000000 03:01 1238761 /root/test/gdbservertest/libtest.so
00fcd000-00fce000 rwxp 00000000 03:01 1238761 /root/test/gdbservertest/libtest.so
08048000-08049000 r-xp 00000000 03:01 1238765 /root/test/gdbservertest/test.exe
08049000-0804a000 rw-p 00000000 03:01 1238765 /root/test/gdbservertest/test.exe
……..
由此能够知道:libtest.so的代码在00fcc000-00fcd000之间。
.检查libtest.so的.text段在内存中的偏移方位:
armv5-linux-uclibc-objdump -h libtest.so |grep .text
输出:
.text 00000130 00000450 00000450 00000450 2**4
即偏移方位为0x00000450
.回到板子上的gdb窗口,加载libtest.so的符号表。
(gdb)add-symbol-file libtest.so 0x00fcc450
(这儿0x00fcc450 = 0x00fcc000 0x00000450)
.在同享库的函数中设置断点
(gdb)b test
.持续调试同享库