array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 GDB在ARM板中的应用 - 爱码网
-glb

GDB的下载:

http://www.gnu.org/software/gdb/

下载gdb-7.4.tar.bz2

1.解压: tar xjf gdb-7.4.tar.bz2

2.编译gdb和gdbserver

2.1   编译gdb:

   cd gdb-7.4/

  .configure -- target=arm-linux  //配置

   make //编译

   make install //安装,注意如果直接运行make install的话,直接撞到pc机的usr/bin中去了。我不想这么直接安装,想看看安装时生成什么东西?

   vi makefile,然后搜索prefix,这prefix就是指代安装的路径。因此我可以自定义我的安装路径

   mkdir tmp

   make install prefix = $PWD / tmp

   此时可以去tmp目录下,看一下都生成了什么东西。你会看到有bin  include   lib   share目录。进入bin目录,你会看到arm-linux-gdb的程序。

2.2  编译gdbserver

  cd gdb / gdbserver

  .configure  --host = arm-linux

   make

   编译的过程中会出现错误:PTRACE GETSIGINFO没有定义。-I表示头文件在哪里。在-I指定的头文件中没有所需要的头文件,怎么板呢?

  注意:头文件除了在-I指定的目录里找,还去交叉编译工具链里面找,交叉编译工具链在哪呢?

  echo $PATH

  cd /tools/gcc-3.4.5-glibc-2.3.6/bin

  grep "PTRACE_GETSIGINFO"  * -nR,搜索后发现,该宏在arm-linux/inluce/linux / ptrace.h中已经定义了,那为什么提示没有定义呢?

  打开出错的文件:linux-arm-low.c,发现它包含的是include <sys/ptrace.h>,因此我们修改为 #include <linux / ptrace.h>

  此时再进行编译,就不会有任何问题了。最终生成gdbserver

3.  在开发板中使用GDB的原理

  

 

 在PC机里编译APP程序,然后在PC机里进行调试,此时我们使用的工具是gdb

 我们把编译好的APP文件拷贝到ARM板上,因为这个程序是运行在ARM板上。

 我们在PC机里如何去调试在ARM板中运行的程序呢?带着这个问题,一步步的向下走。

在PC机上,gdb发出的命令给谁呢?比如说,设一个断点,它会不会直接给ARM板上的APP程序。答案显然不会的,此时gdb_server就要出场了,这个gdb_server就是APP的父进程。在PC机上运行的gdb发出命令给gdb server,比如说想让APP这个程序停止,此时就发送命令给gdb server,gdb server收到命令后,就给子进程(APP程序)发一个信号,让该程序停止下来。

举个例子:gdb去读APP中的变量a

gdb会从带有调试信息的文件中确定a变量的地址,然后发送命令给gdb server,gdb server再去访问APP的内存空间。

编译要调试的应用程序,编译时加上-g选项: arm-linux-gcc -g -o test_debug test_debug.c,把编译出来的test_debug拷贝到开发板上。

调试:

(1)在ARM板上

gdbserver  192.168.1.17 : 端口   ./test_debug

注意:此IP地址为ARM的ip地址,从这里可以看出,在使用之前,需要确保arm板和PC机必须ping的通。

端口可以随便写,在这里取2345

(2)在PC机上

arm-linux-gdb  ./test_debug

(gdb) target remote 192.168.1.17 : 2345 (建立PC和开发板的连接)

(gdb) l

你会看到接下来的使用方式和前几篇博客中介绍的gdb的使用方法完全相同了

法2:让程序在开发板上直接运行,当它产生错误时,令它产生core dump文件,将此文件拷贝到pc机上,在PC机上使用gdb,根据core dump文件找到程序发生错误的地方。

(1)ulimit -c unlimited

(2)在开发板上执行应用程序,程序出错时会在当前目录下生成名为core的文件

./test_debug    (假设这个应用程序有问题)

执行后,会出现Segmentation fault (core dump)

注意这是在开发板上得到的core dump文件,需要将它拷到PC机上。

(3)在PC机上执行:

arm-linux-gdb  ./test_dubug  ./core

在这里你会看到又进入了(gdb)调试的界面了。

总结:

在嵌入式开发中,我们肯定会去调试在ARM板中运行的程序,本篇博客就简单的介绍了如何调试在开发板上运行的程序。在搭建好环境后,还是会回到gdb调试程序的界面,这个界面就和之前的gdb使用方法完全一样了,因此想要高效的调试嵌入式程序,熟练掌握gdb的基本使用方法是关键。

  

 

   

  

分类:

技术点:

相关文章: