(本编主要内容为 安装和调试)
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(二、)gdb产生的两个可执行文件,如何部署:
(I)gdb源码包编译后产生两个可执行程序:
->1. pc段上使用的gdb调试器:arm-linux-gdb / arm-linux-gdb-stripped(arm-linux-gdb瘦身后的)
->2. arm+linux板上使用的gdb服务器程序:gdbserver-stripped (这个必须是瘦身后的)
(II)这两个可执行文件怎么部署:
->1. arm-linux-gdb-stripped ,拷贝到 PC端虚拟机中ubuntu的 /bin/ 目录下: cp arm-linux-gdb-stripped /bin/
->1.1. 修改arm-linux-gdb-stripped 文件属性,加上可执行属性; chmod a+x /bin/arm-linux-gdb-stripped
->1.2. 在命令行查看arm-linux-gdb-stripped 是否可用。
-》直接在命令行: arm-linux- 。
-》然后按tab键,看能不能出来arm-linux-gdb-stripped。如果能,就是可以了。
->2. gdbserver-stripped , 拷贝到 arm+linux 开发板的根文件系统 的 /bin/ 目录下: cp gdbserver-stripped /bin
->2.1. 修改gdbserver-stripped 文件属性,加上可执行属性;chmod a+x /bin/gdbserver-stripped
->2.2. 在命令行查看gdbserver-stripped 是否可用。
-》直接在命令行: gdbserver- 。
-》然后按tab键,看能不能出来gdbserver-stripped。如果能,就是可以了。
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(三、)如何使用gdb 调试开发板上的应用程序:
有两种调试方法:
-> 一种是,按照代码,一步一步的进行调试。
-> 另一种是,使用core dump文件,来查找错误。(当应用程序执行错误时,会生成core 文件,我们可以根据core这文件来看出出错的地方)
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(四、)如何使用gdb 调试开发板上的应用程序:(按照代码,一步一步的进行调试。)
(I).首先在 pc机端 使用 嵌入式交叉编译工具链 编译 应用程序。(注意:编译时一定要加上 -g 选项) //不过海思的代码,好像都默认加过 -g.我猜想如果没有加过-g,在编译的flag 里加上就行。
-》1.pc机端 使用 嵌入式交叉编译工具链 编译 应用程序。(假如生成的可执行程序是test_main)(注意:编译时一定要加上 -g 选项):arm-himix200-linux-gcc -g -o test_main test_main.c
-》2.将该test_main 可执行程序拷贝一份到 arm+linux的板子的根文件系统中。(在这里建议使用 nfs 挂载的根文件系统)
-》3.在pc机端,也要保留一份test_main可执行程序(切记:这一份一定要和arm+linux板子中的一样)。假如pc端可执行文件存放在:/home/book/xxx。
(II).首先在arm+linux的板子进行操作:
-》1.运行板子上的gdbserver服务器程序 和 可执行应用程序,并指定arm板子的IP和端口,目的是为了在pc端调试时,可以找到板子。
-->gdbserver-stripped 192.168.1.10:2345 ./test_main (IP地址是arm板的ip地址,端口号随便写,这里使用的端口号是2345)
(III).在到pc机端,进行如下操作:
-》1.在pc端,可执行应用程序目录中,启动arm-linux-gdb-stripped调试器,并调用可执行应用层序:
->arm-linux-gdb-stripped ./test_main (注意:指定板子ip和端口,是在该步启动的gdb命令行中指定)
-》2.在上步命令执行后,会运行gdb调试器,并显示出gdb命令行。我们需要在gdb命令行中执行,应用程序是运行在什么IP,什么端口的板子上。
->(gdb) target remote 192.168.1.10:2345 (注意:这里一定要和arm板子上的gdbserver服务程序中指定的ip和端口一样)。
-》3.执行完上一步,就可以开始gdb调试了。
gdb调试,主要是在 pc 端上进行。
~+++++++++++++++++++++++~~~
gdb调试 常用命令如下:
->1. l // l 命令 就是 list的意思,就是列举代码
->2. break main // 在main函数中打断点。(在main函数真正开始的代码中打断点)
->3. c // c 命令 就是continue的意思。
->4. break test_main.c:25 // 在 test_main.c文件的 第25行打断点。 在指定文件中的指定行。
->5. step // 进入某一个函数进行单步调试。
->6. print *p // 打印 *p变量的值。当然,*p可以换成其他的变量名。
->7. break c_func // 在 c_func 函数上打断点。(c_func 是一个函数名)
->8. quit // 退出。
->9. bt //查看调用关系 (使用core文件调试时使用)
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(五、)如何使用gdb 调试开发板上的应用程序:(使用core dump文件,来查找错误。)
注意:
1.(当应用程序执行错误时,会生成core 文件,我们可以根据core这文件来看出出错的地方)
2.另一种方法;让程序在开发板上直接运行,当它发生错误时,令它产生core dump 文件。
然后使用gdb,根据core dump 文件找到发生错误的地方。
3. 根据core dump查找错误,可以上网搜索 core dump .
调试方法如下:
I.在arm板上,进行如下操作:
->1.首先检查一下是否生成core文件:ulimit -c 。
如果ulimit -c执行后,显示0.则表示产生错误的是,产生的core文件大小为0.(我理解为不产生)。(如果是0,则执行ulimit -c unlimited)
如果ulimit -c执行后,显示unlimited。 就表示产生错误的是,产生的core文件大小不限制。(如果是这一步,则不进行下面的一步)
->2.取消 core文件的大小限制:ulimit -c unlimited 。
(之后,在执行ulimit -c,就会显示unlimited)
->3.这时候,才执行应用程序: ./test_main . (假如该文件,执行出错)
->4.执行完这一步,可以使用 ls -l .可以在当前目录中看到名为 core 的文件。
II.下一步,应该是在pc端上执行:
->5.将arm板上的core文件 拷贝到 pc机上 test_main可执行程序所在的目录中。
(book@www.100ask.org:~/xxx$ cp /work/rootfs_hi/rootfs_glibc/root/core . -rf)
->6.在该目录中执行:
sudo arm-linux-gdb-stripped ./test_main ./core (使用gdb调试器 调试应用程序,并加上 core文件)
执行完这一步,就会显示出在哪里出的错,因为什么出的错。并进入gdb 命令行界面。
->7.在gdb命令行中 输入:bt .查看调用关系。
(gdb) bt //查看调用关系。
->8.然后我们根据“出在哪里出的错”,“因为什么出的错”,和 调用关系,来处理错误。
我的感悟:
1.首先,我们应该使用core 文件查找到出错的地方,然后 在使用 一步一步的调试方法进行。
2.当然,如果我们在core文件查找错误的这一步,如果我们解决了,就不用做下一步调试。
3.如果第一步,解决不了,然后就在用第一种方法,进行一步一步进行调试。
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如何使用gdb 调试开发板上的应用程序:(按照代码,一步一步的进行调试。)
gdb安装过程如下:(如下是 arm+linux板的 根文件系统路径)
-》cp arm-linux-gdb-stripped /bin/ (这是pc段)
-》chmod a+x /bin/arm-linux-gdb-stripped
-》cp gdbserver-stripped /bin (这是arm板上)
-》chmod a+x /bin/gdbserver-stripped
-》编写 test_main.c
-》arm-himix200-linux-gcc -g -o test_main test_main.c
-》arm开发板上:
--》1. gdbserver-stripped 192.168.1.10:2345 ./test_main (IP地址是arm板的ip地址,端口号随便写,这里使用的端口号是2345)
-》在pc端上;
--》2. arm-linux-gdb-stripped ./test_main
产生 (gdb) 命令行
--》3. (gdb) target remote 192.168.1.10:2345
--》4. (gdb) l // l 命令 就是 list的意思,就是列举代码
显示如下:
(gdb) l
10 }
11 void A(int *p)
12 {
13 B(p);
14 }
15
16 void A2(int *p)
17 {
18 C(p);
19 }
(gdb)
--》5. (gdb) break main //在main函数中打断点。
--》6. (gdb) c // c 命令 就是continue的意思。
--》7. (gdb) break test_main.c:25 // 在 test_main.c文件的 第25行打断点。 指定行。 *****
--》8. (gdb) step //进入某一个函数进行单步调试。 *****
--》9. (gdb) print *p //打印 *p变量的值。
--》10.(gdb) step
--》11.(gdb) print *p //打印 *p变量的值。 *****
--》12.(gdb) break A //在A函数上打断点。 *****
--》13.(gdb) c
--》14.(gdb) step
--》15.(gdb) step
--》16.(gdb) step
--》17.(gdb) quit // quit 命令,表示退出。
--》18.y