gdbserver编译
1. gdb主要帮助用户在调试程序时完成哪些工作
远程调试环境由宿主机GDB和目标机调试
stub共同构成,两者通过串口或TCP连接。使用GDB标准远程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub
是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。就目前而言,嵌入式linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:
用ROM Monitor调试目标机程序
用KGDB调试系统内核
用gdbserver调试用户空间程序。
这三种调试方法的区别主要在于:目标机远程调试stub的存在形式的不同,而其设计思路和实现方法则是大致相同的,而我们最常用的是调试应用程序,就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序,采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采gdb+gdbserver的方式进行调试。Gdbserver在目标系统中运行,gdb则在宿主机上运行。
下载需要用的的软件包。
一.编译安装arm-linux-gdb
<1>#tar jxvf gdb-7.3.tar.bz2
<2>#cd gdb-7.3
<3>#./configure--target=arm-linux --enable-sim --prefix=/usr/local/bin
<4>#make
<5>#make install
二.编译安装gdbserver
<1>#cd gdb-7.3/gdb/gdbserver
<2>#./configure --target=arm-linux--host=arm-linux
<3>#make
这样在gdb-7.3/gdb/gdbserver目录下就生成了一个gdbserver可执行文件,拷贝到目标开发板上.
三.测试arm-linux-gdb + gdbserver
<1>在超级终端输入:
#./gdbserver 192.168.100.1:2345 hello
[192.168.100.1为pc机ip地址,2345为监听端口,hello为待调试程序
这样在开发板上可以看到如下提示信息:
Process wpa_cli created; pid = 730
Listening on port 2345
表示gdbserver 成功运行等待客户端的连接信息
<2>在pc机上输入:
#arm-linux-gdb hello
然后在GDB界面输入:
#target remote 192.168.100.2:2345
[192.168.100.2为开发板ip地址,2345为开发版监听端口]
这样在开发板上可以看到如下提示信息:
Remote debugging from host 192.168.100.1
表示gdbserver成功运行并且建立连接关系,等待客户端的调试信息。
2. 有没有编译好的gdbserver
首先是编译arm-linux-gdb:
解压进入目录后配置并编译安装(注意我们这里用的编译buildroot的arm工具链,在/home/max/qemu/buildroot/buildroot-2012.05/output/host/usr/bin/目录下,可以添加到环境变量,或者修改gdb的Makefile)
3. 嵌入式ARM linux操作系统中如何构建交叉开发环境
这个问题相当专业了,之前我去周立功那边了解过的。
按照以下步骤进行安装:
1) 安装32位的兼容库和libncurses5-dev库
在安装交叉编译工具之前需要先安装32位的兼容库和libncurses5-dev库,安装32兼容库需要从ubuntu的源库中下载,所以需要在Linux主机系统联网的条件下,通过终端使用如下命令安装:
vmuser@Linux-host ~$sudo apt-get install ia32-libs
若Linux主机系统没有安装32位兼容库,在使用交叉编译工具的时候可能会出现错误:
-bash: ./arm-fsl-linux-gnueabi-gcc: 没有那个文件或目录
在终端中使用如下命令则可以安装libncurses5-dev库。
vmuser@Linux-host ~$sudo apt-get install libncurses5-dev
如果没有安装此库,在使用make menucofig时出现如下所示的错误:
*** Unableto find the ncurses libraries or the
*** required headerfiles.
*** 'makemenuconfig' requires the ncurses libraries.
***
Installncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] 错误 1
make: *** [menuconfig] 错误 2
2) 安装交叉编译工具链
将交叉编译工具“gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2”文件通过U盘的方式拷贝到Linux主机的“/tmp”目录下,然后执行如下命令进行解压安装交叉编译工具链:
vmuser@Linux-host ~$ cd /tmp
vmuser@Linux-host ~$ sudo tar -jxvfgcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2 -C /opt/
vmuser@Linux-host /tmp$ # 输入vmuser用户的密码“vmuser”
执行完解压命令后,交叉编译工具链将被安装到“/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0”目录下。交叉编译器的具体目录是“/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin”,为了方便使用,还需将该路径添加到PATH环境变量中,其方法为:修改“/etc/profile”文件,具体操作方法如下:
在终端中输入如下指令
vmuser@Linux-host ~$ sudo vi /etc/profile # 若提示输入密码,则输入“vmuser”
用vi编辑器打开“/etc/profile”文件后,在文件末尾增加如下一行内容:
export PATH=$PATH:/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin
文件修改并保存后,再在终端中输入如下指令,更新环境变量,使设置生效。
vmuser@Linux-host ~$source /etc/profile
在终端输入arm-fsl-linux-gnueabi-并按TAB键,如果能够看到很多arm-fsl-linux-gnueabi-前缀的命令,则基本可以确定交叉编译器安装正确,如下图所示。
4. 如何在安卓系统上使用arm-linux-gdb调试内核
1,先下载最新版本的gdb源代码包,我使用的是gdb-7.6.tar.gz,使用tar命令进行解包(tar -xvzf gdb-7.6.tar.gz),cd进gdb-7.6/gdb目录,使用vi找到remote.c中的如下代码:
if(buf_len > 2 * rsa->sizeof_g_packet)
error(_("Remote 'g' packet reply is too long: %s"),rs->buf);
将上面两行注释掉,添加如下代码
if(buf_len > 2 * rsa->sizeof_g_packet)
{
rsa->sizeof_g_packet = buf_len;
for(i = 0; i < gdbarch_num_regs(gdbarch); i++)
{
if(rsa->regs[i].pnum == -1)
continue;
if(rsa->regs[i].offset >= rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet = 0;
else
rsa->regs[i].in_g_packet = 1;
}
}
使用如下命令对代码进行配置、编译和安装
./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v
make
make install
2,gdbserver使用android4.2模拟器中自带的版本(v7.1)
3,将NDK编译好的C/C++可执行程序,上传到模拟器中/data/test目录下,假设可执行程序的名称为testHello。
4,使用命令:gdbserver :7000 /data/test/testHello 启动模拟器端的调试。
5,启动arm-linux-gdb之前,使用vi打开~/.bash_profile文件,在其中添加:
export PATH=$PATH:/usr/local/arm-gdb/bin,以便在程序的其他目录可以直接启动arm-linux-gdb程序
6,cd至ndk编译好的testHello文件所在目录
7,使用如下命令进行端口映射:adb forward tcp:7000 tcp:7000,将模拟器的7000端口和本机的7000端口进行映射
8,使用命令:arm-linux-gdb testHello启动gdb调试
9,使用target remote :7000 链接模拟器中gdbserver启动的服务。
10,自此,我们就可以使用gdb命令进行代码调试了。
5. 请教HP UNIX 安装GDB详细步骤
(1) download gdb source
ftp://ftp.gnu.org/gnu/gdb/
(2) compile
(2.1) compile gdb
./configure --target=arm-linux -v
make
在gcc4.0中,强制转换的值不能做左值.
如果您和我一样用的是gcc 4.0, 那只好把这几个慧巧地方修改了,也不知道是不是因为这个原因,有了本文最后面的那个问题。
(2.2) compile gdbserver(这个是要运行在arm上的,所以要进行交叉编译)
cd gdb/gdbserver
./configure --target=arm-linux --host=arm-linux
把config.h中的以下这一行用//注释掉
// #define HAVE_SYS_REG_H 1
make CC=arm-linux-gcc
libthread_db.so.1找不到的问题也比较麻烦,可以再把下面这一行注释掉
/* Define if you have the header file. */
//#define HAVE_THREAD_DB_H 1
(3)
run gdbsever on the ARM board
# gdbserver 1Array2.168.0.2:1254 hello
run gdb on the pc
[root@localhost helloWorld]# ./gdb
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show ing" to see the conditions.
There is absolutely no warranty for
GDB.&嵌入式Linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target
Board端使用gdbserver。调试时,应用程序在嵌入式目标系统上运行,而gdb调试在Host端。
一、编译安装gdb+gdbserver
首先下载gdb源码,我下载的是gdb-6.6.tar.gz。
$tar xvzf gdb-6.6.tar.gz
$mkdir mygdb
$cd mygdb
必须要在你想要安装的目录下执行下边的命令。
$../gdb-6.6/configure --target=arm-linux \ --prefix=/home/a/mygdb
参裂碧州数说明:target是你的目标板,我的是arm-linux,prefix是你要安装的目标文件夹。
$make
$make install
然后建立gdbserver。
$mkdir mygdbserver
$cd mygdbserver
$chmod +x ../gdb-6.6/gdb/gdbserver/configure
$CC=arm-linux-gcc ../gdb-6.6/gdb/gdbserver/configure \
--host=arm-linux --prefix=/home/a/mygdbserver
$make
$make install
$arm-linux-strip gdbserver
去除调试信息。不去好像不行肆蔽,我的就不行,去了就ok了。
复制到你的开发板上就可以了。
二、调试步骤
1、交叉编译,带参数-g加入调试信息。
假设要调试的程序为test.c。
#arm-linux-gcc -g test.c -o test
2、在Target Board开启gdbserver
#gdbserver :2345 test
gdbserver开始监听2345端口(你也可以设其他的值),然后启动test,你会看到“Process test created:pid=88”
3、回到Host端
#arm-linux-gdb test
最后一行显示:This GDB was configured as “--host=i686-pc-linux-gnu,--target=arm-linux”...
说明此gdb在X86的Host上运行,但是调试目标是ARM代码。
(gdb)target remote :2345
注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。
建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。因为程序已经在Target Board上面由gdbserver启动了。结果输出是在Target Board端,用超级终端查看。
6. gdb加载动态库成功,但是不能显示动态库中的源码(gdb+gdbserver)
因为具体的给的不够详细,不清楚你遇到的情况。
如果仅从断点上看,应该就是CApartment.cpp:55
但是,如果你的程序编译的时候,不是-O0,那个可能回不到源码,只能看汇编。
1、有时候(很少)就是编译器的错误。
2、还有可能就是你调试的程序和你的源码不匹配
3、你的程序已经崩溃了,破坏了堆栈或者GDB需要的数据。
4、这个地方有特殊的定位信息
5、其他情况,还是比较多的,经常遇到。
如果懂汇编,最好看看汇编。
如果不懂,看看那一条语句是最后一条能够跟踪的语句。
仔细看看最后一条语句的所有变量,应该能猜出来是什么问题。
7. 开发板上如何使用GDB
调试时,应用程序在嵌入式目标系统上运行,而gdb调试在Host端。 一、编译安装gdb+gdbserver 首先下载gdb源码,我下载的是gdb-6.6.tar.gz。$tar xvzf gdb-6.6.tar.gz$mkdir mygdb$cd mygdb必须要在你想要安装的目录下执凳裤行下边的命令。$../gdb-6.6/configure --target=arm-linux \ --prefix=/home/a/mygdb参数说明:target是你的目标板,我的是arm-linux,prefix是你要安装的目标文件夹。$make$make install然后建立gdbserver。$mkdir mygdbserver$cd mygdbserver$chmod +x ../gdb-6.6/gdb/gdbserver/configure$CC=arm-linux-gcc ../gdb-6.6/gdb/gdbserver/configure \--host=arm-linux --prefix=/home/a/mygdbserver$make$make install$arm-linux-strip gdbserver去除调试信息。不去好像不行,我的就不行,去了就ok了。复制到你的开发板上就可以了。 二、调试步骤1、交叉编译,带念消参数-g加入调试信息。假设要调试的程序为test.c。#arm-linux-gcc -g test.c -o test2、在Target Board开启gdbserver#gdbserver :2345 testgdbserver开始监听2345端口(你也可以设其他的值),然后启动test,你会看到“Process test created:pid=88”3、回到Host端#arm-linux-gdb test最后一行显示:This GDB was configured as “--host=i686-pc-linux-gnu,--枣高简target=arm-linux”...说明此gdb在X86的Host上运行,但是调试目标是ARM代码。(gdb)target remote :2345注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。
8. android开发,怎么使用ndk编译成.so文件
一、首先下载android-ndk,官方网站是:http://developer.android.com/tools/sdk/ndk/index.html
目前最新的版本是android-ndk-r8e-windows-x86.zip,下载地址:
http://dl.google.com/android/ndk/android-ndk-r8e-windows-x86.zip
下载后把压缩包解压出来,例如:D:\ndk,目录下的ndk-build.cmd就是用来编译的批处理命令。
二、编译,打开cmd命令行窗口,cd进入目录:D:\ndk\samples\hello-jni,
然后执行命令:D:\ndk\ndk-build.cmd(如果设置过环境变量则直接使用ndk-build.cmd)来编译hello-jni,如果没有错误会输出:
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
"Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
三、创建android应用程序并使用so文件
打开eclipse创建一个android应用程序HelloJni,默认的com.example.hellojni包下面有一个MainActivity.java,
在此包下添加一个HelloJni.java,