gdb编译安装-调试步骤(二)

(本编主要内容为 安装和调试)

				
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~+++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+++++++++++++++++++++++++++++++++++++++++++++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(二、)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
		
			
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值