Android中使用arm-eabi-gdb和vim进行调试

本文介绍了一种使用GDB进行调试的方法,包括启动调试会话、设置断点、查看变量及切换不同类型的GDB等。此外,还提供了一个脚本简化这一过程。
部署运行你感兴趣的模型镜像

1.##gdbserver 10.0.2.2:1234 /system/bin/ping

 

 

2.$telnet localhost 5554

 

Trying ::1...

telnet: connect to address ::1: Connection refused

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

Android Console: type 'help' for a list of commands

OK

 

redir add tcp:1234:1234

 

3.(gdb)file ping

4.(gdb)target remote localhost:1234

 

5.(gdb)l main

(gdb)b main

(gdb) c 不是run

 

6.<<<gdb_mappings.vim>>>

" Mappings example for use with gdb

" Maintainer: <xdegaye at users dot sourceforge dot net>

" Last Change: Mar 6 2006

 

if ! has("gdb")

    finish

endif

“ ---------------------------------------------------------------------------------------

 

" Shift+E

let s:emOS_K = 1

nmap <silent> E :call <SID>emOS()<CR>

 

function! s:emOS()

if s:emOS_K

let s:emOS_K = 0

exec ":! ln -sf ~/android/android_eclair/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gdb ~/usr/bin/gdb"

echohl ErrorMsg

echo "Now! Gdb is ready for Embedded System!!!"

echohl None

else

let s:emOS_K = 1

exec ":! ln -sf /usr/bin/gdb-pc ~/usr/bin/gdb"

echohl ErrorMsg

echo "Gdb is ready for PC Now."

echohl None

endif

endfunction

 

 

“ ---------------------------------------------------------------------------------------

 

let s:gdb_k = 1

nmap <F7> :call <SID>Toggle()<CR>

 

" Toggle between vim default and custom mappings

function! s:Toggle()

    if s:gdb_k

    “ ---------------------------------------------------------------------------------------

    nmap <F8> :bel 25vsplit gdb-variable<CR>

    nunmap E

     “ ---------------------------------------------------------------------------------------

 

let s:gdb_k = 0

 

map <Space> :call gdb("")<CR>

nmap <silent> <C-Z> :call gdb("/032")<CR>

 

nmap <silent> B :call gdb("info breakpoints")<CR>

nmap <silent> L :call gdb("info locals")<CR>

nmap <silent> A :call gdb("info args")<CR>

nmap <silent> S :call gdb("step")<CR>

nmap <silent> I :call gdb("stepi")<CR>

nmap <silent> <C-N> :call gdb("next")<CR>

nmap <silent> X :call gdb("nexti")<CR>

nmap <silent> F :call gdb("finish")<CR>

nmap <silent> R :call gdb("run")<CR>

nmap <silent> Q :call gdb("quit")<CR>

nmap <silent> C :call gdb("continue")<CR>

nmap <silent> W :call gdb("where")<CR>

nmap <silent> <C-U> :call gdb("up")<CR>

nmap <silent> <C-D> :call gdb("down")<CR>

 

" set/clear bp at current line

nmap <silent> <C-B> :call <SID>Breakpoint("break")<CR>

nmap <silent> <C-E> :call <SID>Breakpoint("clear")<CR>

 

" print value at cursor

nmap <silent> <C-P> :call gdb("print " . expand("<cword>"))<CR>

 

" display Visual selected expression

vmap <silent> <C-P> y:call gdb("createvar " . "<C-R>"")<CR>

 

" print value referenced by word at cursor

nmap <silent> <C-X> :call gdb("print *" . expand("<cword>"))<CR>

 

echohl ErrorMsg

echo "gdb keys mapped"

echohl None

 

    " Restore vim defaults

    else

let s:gdb_k = 1

“ ---------------------------------------------------------------------------------------

exec ":! ln -sf /usr/bin/gdb-pc /~/usr/bin/gdb"

nmap <silent> E :call <SID>emOS()<CR>

“ ---------------------------------------------------------------------------------------

nunmap <Space>

nunmap <C-Z>

nunmap B

nunmap L

nunmap A

nunmap S

nunmap I

nunmap <C-N>

nunmap X

nunmap F

nunmap R

nunmap Q

nunmap C

nunmap W

nunmap <C-U>

nunmap <C-D>

 

nunmap <C-B>

nunmap <C-E>

nunmap <C-P>

nunmap <C-X>

 

echohl ErrorMsg

echo "gdb keys reset to default,reset gdb to gdb-pc."

echohl None

    endif

endfunction

 

" Run cmd on the current line in assembly or symbolic source code

" parameter cmd may be 'break' or 'clear'

function! s:Breakpoint(cmd)

    " An asm buffer (a 'nofile')

    if &buftype == "nofile"

" line start with address 0xhhhh...

let s = substitnmap <F8> :bel 25vsplit gdb-variable<CR>ute(getline("."), "^//s*//(0x//x//+//).*$", "*//1", "")

if s != "*"

   call gdb(a:cmd . " " . s)

endif

    " A source file

    else

let s = "/"" . fnamemodify(expand("%"), ":p") . ":" . line(".") . "/""

call gdb(a:cmd . " " . s)

    endif

endfunction

 

“ ---------------------------------------------------------------------------------------

" map gdb-pc/arm-eabi-gdb

call s:emOS()

“ ---------------------------------------------------------------------------------------

 

" map vimGdb keys

call s:Toggle()

 

说明:上述方法是为了方便,但这样修改反而变得复杂了。如果要实现PC和ARM不同gdb的之间的切换手动就可以了。

 

#gdb-sel.sh

 

#!/bin/bash

 

echo "select gdb between PC and ARM."

echo "Please use:

ln -sf /media/sanux/android/android_eclair/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gdb /media/sanux/usr/bin/gdb

or

ln -sf /usr/bin/gdb-pc /media/sanux/usr/bin/gdb"

 

echo -ne "current gdb is:/n"

ls -l /media/sanux/usr/bin/gdb

#ln -sf /media/sanux/android/android_eclair/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gdb /media/sanux/usr/bin/gdb

#ln -sf /usr/bin/gdb-pc /media/sanux/usr/bin/gdb

 

 

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think> 我们正在解决系统中执行 `arm-openwrt-linux-muslgnueabi-gdb` 时提示 `-sh: arm-openwrt-linux-muslgnueabi-gdb: not found` 的问题。 根据引用[2]引用[3]的思路,该错误通常是因为系统找不到该命令,可能有两种原因: 1. 该工具链尚未安装。 2. 工具链已安装但未正确配置环境变量。 因此,解决步骤应分为两部分:安装工具链配置环境变量。 ### 步骤一:确认工具链是否安装 首先需要确认系统中是否已经安装了包含 `arm-openwrt-linux-muslgnueabi-gdb` 的交叉编译工具链。 #### 1. 搜索工具链 在终端中尝试使用 `find` 或 `locate` 命令搜索: ```bash sudo find / -name "arm-openwrt-linux-muslgnueabi-gdb*" 2>/dev/null ``` 或者 ```bash locate arm-openwrt-linux-muslgnueabi-gdb ``` 如果未安装 `locate`,可先执行 `sudo updatedb` 更新数据库。 #### 2. 安装工具链 如果未找到,则需要安装该工具链。根据引用[2],OpenWrt 工具链可以通过以下方式获取: ```bash # 安装必要的依赖 sudo apt-get update sudo apt-get install build-essential libncurses5-dev gawk git # 克隆 OpenWrt 源码(这里以21.02分支为例) git clone --branch openwrt-21.02 https://git.openwrt.org/openwrt/openwrt.git ``` 然后进入 OpenWrt 目录编译工具链: ```bash cd openwrt make menuconfig # 选择目标平台为 ARM,并勾选 Toolchain 中的 gdb make -j$(nproc) V=s ``` 编译完成后,工具链会位于 `staging_dir/toolchain-arm_.../bin` 目录下。 ### 步骤二:配置环境变量 如果工具链已安装但未在 PATH 中,则需将工具链路径加入环境变量(参考引用[3])。 #### 1. 查找工具链的实际路径 通过步骤一中的搜索,假设找到工具链路径为: ``` /home/user/openwrt/staging_dir/toolchain-arm_cortex-a7+neon-vfpv4_gcc-8.4.0_musl_eabi/bin ``` #### 2. 修改环境变量 编辑 `~/.bashrc` 或系统级配置文件 `/etc/profile`: ```bash vim ~/.bashrc ``` 在文件末尾添加(请替换实际路径): ```bash export PATH=$PATH:/home/user/openwrt/staging_dir/toolchain-arm_cortex-a7+neon-vfpv4_gcc-8.4.0_musl_eabi/bin ``` 保存后执行: ```bash source ~/.bashrc ``` 或者重新打开终端。 ### 步骤三:验证配置 执行以下命令确认: ```bash arm-openwrt-linux-muslgnueabi-gdb --version ``` 若正确显示版本信息,则配置成功。 ### ⚠️ 特殊情况处理 1. **32位系统运行64位工具链**:需要安装兼容库 ```bash sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 ``` 2. **权限问题**:确保工具链可执行权限 ```bash chmod -R +x /path/to/toolchain/bin/ ``` 3. **符号链接问题**:有时工具链以不同前缀存在,可创建符号链接 ```bash cd /usr/local/bin ln -s /path/to/toolchain/bin/arm-openwrt-linux-muslgnueabi-gdb . ``` ### 相关问题 1. 如何为 OpenWrt 交叉编译工具链设置永久环境变量? 2. 交叉编译时出现 "cannot find -lc" 错误应如何解决? 3. 如何在 Ubuntu 中安装 OpenWrt SDK? 4. 调试嵌入式程序时 GDB 无法加载动态库符号怎么办? [^1]: 参考工具链路径设置 [^2]: OpenWrt 源码获取方法 [^3]: 环境变量配置方法 </think> ### 解决 `-sh: arm-openwrt-linux-muslgnueabi-gdb: not found` 的方法 #### 1. **确认工具链安装状态** 首先检查工具链是否完整安装: ```bash # 查看工具链目录是否存在 ls -l /path/to/toolchain/bin/ # 检查 gdb 是否在工具链中 find /path/to/toolchain/ -name "*gdb*" ``` 若目录为空,说明工具链未安装完整(常见于通过编译安装时漏选 gdb 组件)。 --- #### 2. **解决方案** ##### (1) 安装完整工具链(推荐) 重新安装包含 gdb 的完整工具链: ```bash # 安装 OpenWrt SDK(包含 gdb) sudo apt install openwrt-sdk-<arch> # 替换 <arch> 为你的架构如 arm_cortex-a7 # 或从源码编译时启用 gdb make menuconfig → Global build settings → [*] Build the gdb debugger → [*] Build the gdbserver ``` ##### (2) 手动修复符号链接 若工具链存在但路径错误: ```bash # 定位实际 gdb 路径 find / -name arm-openwrt-linux-muslgnueabi-gdb 2>/dev/null # 创建符号链接到标准路径 sudo ln -s /actual/path/to/gdb /usr/local/bin/arm-openwrt-linux-muslgnueabi-gdb ``` ##### (3) 配置环境变量 ```bash # 编辑配置文件 vim ~/.bashrc # 添加工具链路径(示例路径) export PATH=$PATH:/your/toolchain/bin # 如 /opt/openwrt-sdk-arm_cortex-a7/bin # 立即生效 source ~/.bashrc ``` ##### (4) 兼容层修复(64位系统) 32位工具链在64位系统需兼容库: ```bash sudo apt install libc6-i386 lib32stdc++6 ``` --- #### 3. **验证修复** ```bash # 检查 gdb 是否可访问 which arm-openwrt-linux-muslgnueabi-gdb # 测试命令执行 arm-openwrt-linux-muslgnueabi-gdb --version ``` 成功时应显示类似: ``` GNU gdb (OpenWrt GCC 8.4.0) 10.1 ``` --- ### ⚠️ 常见问题排查 | 现象 | 解决方案 | |------|----------| | **`command not found` 但工具链存在** | 执行 `ldconfig` 更新库链接 | | **权限问题** | `chmod +x /path/to/gdb` | | **架构不匹配** | 检查工具链架构:`file /path/to/gdb` | | **环境变量冲突** | 检查 `echo $PATH` 中的路径顺序 | --- ### 相关问题 1. 如何为 OpenWrt 交叉编译工具链设置永久环境变量? 2. 交叉编译时出现 "cannot find -lc" 错误应如何解决? 3. 调试嵌入式程序时 GDB 无法加载动态库符号怎么办? 4. 如何确认交叉编译工具链与目标设备的架构兼容性? [^1]: 参考路径设置错误解决方案 [^2]: 工具链安装方法 [^3]: 环境变量配置方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值