OpenWRT开发之——远程debug

想要用gdb对OpenWrt进行远程调试。首先得在OpenWrt目标机上安装gdbserver。

其实在trunk路径下也有gdb的ipk安装包的,不信find一下。


[trunk]$ find bin/ -name "gdb*.ipk"
bin/ar71xx/packages/base/gdb_7.8-1_ar71xx.ipk
bin/ar71xx/packages/base/gdbserver_7.8-1_ar71xx.ipk

查看一下它们的大小:


[trunk]$ ls -lh bin/ar71xx/packages/base/gdb*.ipk
-rw-r--r--. 1 hevake_lcj hevake_lcj 1.5M May  3 02:31 bin/ar71xx/packages/base/gdb_7.8-1_ar71xx.ipk
-rw-r--r--. 1 hevake_lcj hevake_lcj  96K May  3 02:31 bin/ar71xx/packages/base/gdbserver_7.8-1_ar71xx.ipk

OMG,gdb这个包有1.5M!对于FLASH总共才只有8M的路由器,实在有点吃紧!

还好,gdbserver只有96K。我们可以将gdbserver安装在目标机上,将其用网络或串口与开发机上的gdb进行协同使用。

1. 安装gdbserver

gdbserver 可以用 ipk 包进行安装。

在OpenWrt的trunk目录下,运行 make menuconfig,进行系统进行裁剪。

gdbserver在 Development 目录下。

将gdbserver选为M,保存退出。

可以打开 .config 进行查看:

可以看到 CONFIG_PACKAGE_gdbserver=m。

好了,再 make V=s 。

编译完成之后,生成 bin/ar71xx/packages/base/gdbserver_7.8-1_ar71xx.ipk 包文件。

将这个文件用 scp 传送到目标机上,进行安装。


root@OpenWrt:~# opkg install gdbserver_7.8-1_ar71xx.ipk
Installing gdbserver (7.8-1) to root...
Collected errors:
 * satisfy_dependencies_for: Cannot satisfy the following dependencies for gdbserver:
 *     libthread-db *
 * opkg_install_cmd: Cannot install package gdbserver.

依赖 libthread-db 库。那就先安装 libthread 。安装包是:

trunk/bin/ar71xx/packages/base/libthread-db_0.9.33.2-1_ar71xx.ipk

将其传到目标机上并安装。

然后再安装 gdb-server:


root@OpenWrt:~# opkg install gdbserver_7.8-1_ar71xx.ipk
Installing gdbserver (7.8-1) to root...
Configuring gdbserver.

好了!安装好了,那就用用看吧。

2. 试用gdbserver

远程调试需要目标机启动 gdbserver并执行调试目标程序。在调试的过程中,gdbserver开启一个TCP服务,由开发机上的gdb连接。之后 gdbserver接收gdb的指令并将指令操作结果反馈给gdb,从而达到了远程调试的目的。

开发机(CentOS)IP:192.168.1.10

目标机(OpenWrt)IP:192.168.1.2

2.1 首次尝试

在目标机上启动gdbserver


root@OpenWrt:~# gdbserver 127.0.0.1:3000 debug-demo
Process cpp11-demo created; pid = 3335
Listening on port 3000

如上,命令格式为:gdbserver <local IP>:<port> <program> [args list]

<local IP>就写成127.0.0.1,<port>指定为3000,要调试的是debug-demo程序。

如下为程序源码:

src/main.c

#include <stdio.h>

int nGlobalVar = 0;

int tempFunction(int a, int b)
{
    printf("tempFunction is called, a = %d, b = %d \n", a, b);
    return (a + b);
}

int main()
{
    int n;
    n = 1;
    n++;
    n--;

    nGlobalVar += 100;
    nGlobalVar -= 12;

    printf("n = %d, nGlobalVar = %d \n", n, nGlobalVar);

    n = tempFunction(1, 2);
    printf("n = %d\n", n);

    return 0;
}

src/Makefile:

target:=debug-demo
CFLAGS+=-g

objects:=$(subst .c,.o,$(wildcard *.c))

$(target) : $(objects)
    $(CC) $(CFLAGS) -o $@ $^

.PHONY:clean
clean:
    $(RM) $(objects)

值得注意的是:在 src/Makefile中,添加一行:

CFLAGS+=-g

使之在make的时候能够将调试信息加进去。

将这个程序打包安装到OpenWrt上去。至于怎么打包与安装,博主已上前面两三个博文里详细讨论过了,这里不再重复啰嗦。若想了解详细步骤,请参考:【OpenWrt对C++11的支持

然后,在开发机上启动gdb,并执行 target remote 192.168.1.2:3000 进行连接:


$ gdb
(gdb) target remote 192.168.1.2:3000
Remote debugging using 192.168.1.2:3000
warning: while parsing target description (at line 10): Target description specified unknown architecture "mips"
warning: Could not load XML target description; ignoring
Reply contains invalid hex digit 59

出现问题:(1)首先gdb不认识mips平台。(2)没有XML目标描述文件。

2.2 解决问题

应该说,什么样的平台就应该用什么样的gdb进行调试。如果像上面那样,用开发机的 gdb 与目标机上的 gdbserver 连接进行调试,应该是不对的。

那么应该使用 mips 平台的gdb。而这个gdb就在 staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/ 路径下,有一个:mips-openwrt-linux-gdb 文件。

运行它来进行调试:


[trunk]$ cd ./staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/
[bin]$ ./mips-openwrt-linux-gdb
GNU gdb (Linaro GDB) 7.6-2013.05
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-redhat-linux --target=mips-openwrt-linux-uclibc".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>.
(gdb)

可以看到,gdb在启动时提示:"This GDB was configured as "--host=i686-redhat-linux --target=mips-openwrt-linux-uclibc",说明该gdb是针对mips平台的。

这里,博主要总结一下。gdb有三种:

  1. 安装到目标机上,在目标机上运行的gdb。(通过SSH在目标机上运行gdb调试)
  2. 运行在开发机上,用于调试目标机上程序的。(通过SSH在目标机上运行gdbserver开启调试服务,在开发机上启动平台对应的gdb连接gdbserver进行调试)
  3. 运行在开发机上,用于调试开发机程序的。

这3种gdb不能搞混淆了。

好,再连接目标机:

(gdb) target remote 192.168.1.2:3000
Remote debugging using 192.168.1.2:3000
warning: Can not parse XML target description; XML support was disabled at compile time
0x77fe0f40 in ?? ()
(gdb)

结果还是报没有XML目标描述文件。

从网上找到资料:http://blog.csdn.net/yangzhongxuan/article/details/13002789

具这位大牛说,是在编译gdb的时候,没有XML的解析库expat。

那我就在开发机上看一下有没有这个库。用locate查一下:

$ locate libexpat
...
/lib/libexpat.so.1
/lib/libexpat.so.1.5.2
...

说明开发机系统是有expat库的。

那为什么没有编译进去呢?有可能是在编译 gdb 的 ./configure 时候,将expat去除了。

查看trunk路径下,关于gdb包的Makefile。打开文件:package/devel/gdb/Makefile,发现:

嘿!第56行,看到了吗?禁了expat。为什么要禁它???

博主也就尝试一下,把第56行删除。改成:

重新make gdb。

[trunk]$ make package/devel/gdb/install V=s

思考一下:你说,这是编译目标机上在gdb呢,还是开发机上的gdb?

实践证明,我想错了。在package目录下都是要打包成ipk的。

因为上面的make命令并没有影响到:staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gdb

而是:bin/ar71xx/packages/base/gdb_7.8-1_ar71xx.ipk

应该是在 toolchain 目录下的才是。

<未完待续>

时间: 2024-12-22 15:19:09

OpenWRT开发之——远程debug的相关文章

开发连接远程SQL Server 的ASP程序应注意的问题

Microsoft SQL Server7.0是一种大型.分布式数据库系统,也可被认为是一种大型.分布式数据仓库.由于其与Windows NT和BackOffice以及Visual Studio具有紧密的配合,已被越来越多的网络应用系统所采用.而ASP程序也以其和NT的紧密连接,可使用ActiveX对象.CGI接口对象化等特点向CGI程序发起了有力的挑战.下面,就谈谈开发连接远程SQL Server 的ASP程序应注意的几个问题. SQL Server是一个十分注重安全性的数据库,特别是在7.0

在ASP程序应注意的问题---开发连接远程SQL Server

server|程序|问题 Microsoft SQL Server7.0是一种大型.分布式数据库系统,也可被认为是一种大型.分布式数据仓库.由于其与Windows NT和BackOffice以及Visual Studio具有紧密的配合,已被越来越多的网络应用系统所采用.而ASP程序也以其和NT的紧密连接,可使用ActiveX对象.CGI接口对象化等特点向CGI程序发起了有力的挑战.下面,就谈谈开发连接远程SQL Server 的ASP程序应注意的几个问题. SQL Server是一个十分注重安全

eclipse配合tomcat远程debug的疑问?

问题描述 如题,我的疑问是:本地eclipse上的应用时如何与远程服务器上的应用对应上的,之所以这么问是因为我部署在远程服务器上的应用名字和本地应用的名字不一样(上传war包时手动修改的),可他还是能够找到,并远程debug? 问题补充:binfentianshi 写道 解决方案 朋友,我确实不太懂,所以没明白你的意思,不过这两天我看了一下,eclipse远程调试tomcat的相关文章.我明白了你的意思我现在给你我的理解,eclipse进行远程调试时,若你页面上要访问的servlet是在包com

android开发-关于Android Debug的小问题

问题描述 关于Android Debug的小问题 我发现进入这个方法的时候,跳转到源码时,所在的位置不对,请问怎么办开发-关于Android Debug的小问题-android开发遇到问题"> 解决方案 自顶.............. 解决方案二: 紧紧帮你顶一下...加油! 解决方案三: 重新编译生成再试试. 解决方案四: clearn一下--或者你看看是不是权限问题,根本就无权限找到那个方法,关联到了错误的方法上了?

求 tomcat 7 远程debug 官方文档连接地址

问题描述 如题,翻了半天tomcat 7的官方文档也没找到关于远程 debug方面的页面,各位谁知道发一个连接哈 ,不胜感激. 解决方案 http://wiki.apache.org/tomcat/FAQ/Developing

Tomcat中设置远程debug方法

debug 何为远程调试?我们一般调试一个web项目的java代码时,需要将你的tomcat服务器和你的开发工具(比如Jbuilder)集成,或需要工具的一些插件支持(比如Eclipse下的myclipse等),这些方式都是在本地进行,即你的开发工具和tomcat运行在同一台服务器上,如果你的开发工具和服务器不再一台机器上那就需要实现远程调试功能了. 实现方法:在tomcat的catalina.bat文件中加入下面的设置,当然SET CATALINA_OPTS 变量应该在使用它之前.这是在tom

flex 和java 一起开发.实验远程调用.

    首先下载最新的 BlazeDS   http://opensource.adobe.com/blazeds/   最新BlazeDS下载地址.   http://opensource.adobe.com/wiki/display/blazeds/Release+Builds   下面就开始使用flex 创建一个 带java 的web 工程了.   创建工程   下载的是一个 war 文件..不用解压缩. 这个在创建工程的时候用到.   创建一个 flex的工程.    选择 J2EE.

OpenWRT开发之——对C++的支持(解决库依赖问题)

C++是本人的强项.如果在OpenWrt中不能用C++进行开发,那就有点大失所望了. 接下来将与大家一起来尝试写一个C++程序,并把它做成 ipk 包,并试运行. 各文件内容 在 SDK/package/ 路径下创建 cpp-demo 目录,并生成一个非常简单的 cpp 程序 $ cd SDK $ mkdir -p package/cpp-demo $ cd package/cpp-demo $ touch Makefile $ mkdir src $ cd src $ touch Makefi

iOS开发之远程推送

说到远程推送,应该用的也挺多的,今天就基于SEA的云推送服务,做一个推送的小demo,来了解一下iOS中的远程推送是怎么一回事儿,首先你得有苹果的开发者账号,好咸蛋也差不多了,主要内容走起. 一.准备阶段 1.在苹果开发官网上申请推送证书之前需要一个名字叫做certSigningRequest文件.该文件在MAC系统中生成,用于在Apple网站上申请推送证书文件,下面是利用钥匙串生成该文件的步骤: (1).打开Mac下的钥匙串->钥匙串访问->证书助理->从证书颁发机构请求证书,如下图所