文档章节

gdb调试总结

stormm
 stormm
发布于 2016/03/09 17:41
字数 1064
阅读 302
收藏 4

一、安卓机器中本地使用gdb调试

!android shell
$cd /data/local/tmp
$wget http://dan.drown.org/android/gdb-static.tar.gz
$tar zxf gdb-static.tar.gz
$chmod 777 gdb
$./gdb 程序名
....

二、双机(安卓上安装gdbserver,PC端运行gdbclient)

1、编译native代码时使用NDK_DEBUG参数,编译完成后会在libs/armeabi-v7/下多生成两个文件gdb.setup和gdbserver;

!windows shell
$ndk-build NDK_DEBUG=1

2、将gdbserver拷贝到手机目录下

!windows shell
$adb push gdbserver /data/local/tmp/
$adb shell chmod 777 /data/local/tmp/gdbserver

3、运行gdbserver

!android shell 1
$cd /data/local/tmp
$./gdbserver :1234 ;如果附加进程则--attach 2222
。。。

4、转发端口(另开一个shell)

!windows shell
$adb forward tcp:1234 tcp:1234

 

5、PC端使用gdbclient链接(使用NDK中自带的gdb)

!windows shell
$cd <your_path>\android-ndk-r10e\toolchains\arm-linux-androideabi-4.9\prebuilt\linux-x86_64\bin
$./arm-linux-androideabi-gdb 
    $$ target remote :1234                       ;连接远程gdbserver
    $$ set args "Hello, World" Test              ;设置参数
    $$ show args
    $$ set solib-search-path obj/local/armeabi   ;设置符号路径
    $$ bt                                        ;查看堆栈
    $$ l                                         ;有符号会显示pc附件源码
    $$ break main                                ;下断点
    $$ run                                       ;运行
    $$ n                                         ;n单步执行 s单指令执行
    $$ x                                         ;查看内存
    $$ info sharedlibrary                        ;查看加载的共享模块
    $$ show debug-file-directory                 ;调试符号目录
    $$ set debug-file-directory <directory>      ;设置调试符号目录
    $$ set symbol-file <directory>               ;设置符号文件
    $$ set arm fallback-mode                     ;设置thumb模式 
    $$ set arm force-mode                        ;设置arm模式
    $$ break 0x400c0e88 + (($cpsr>>5)&1)         ;thumb模式下断点需要+1
    $$ break context_switch if next == init_task ;break condition
    $$ command 1 > print xx1 > print xx2 >end    ;断点一中断时输出的信息
    $$ p MACROS                                  ;宏显示不了需要编译时make KCFLAGS=-ggdb3
    $$ disass                                    ;显示汇编代码
    $$ set $r0=1                                 ;设置寄存器的值
    $$ po self                                   ;po是print-object的简写 ios特有
    $$ info proc                                  ;all -- List all available /proc info
    $$ info proc                                  ;cmdline -- List command line arguments of the process
    $$ info proc                                  ;cwd -- List current working directory of the process
    $$ info proc                                  ;exe -- List absolute filename for executable of the process
    $$ info proc                                  ;mappings -- List of mapped memory regions
    $$ info proc                                  ;stat -- List process info from /proc/PID/stat
    $$ info proc                                  ;status -- List process info from /proc/PID/status

 

x /nfu 0x<addr>:查看内存地址中的值。
  n表示要显示的内存单元的个数
  f表示显示方式, 可取如下值
    x 按十六进制格式显示变量。
    d 按十进制格式显示变量。
    u 按十进制格式显示无符号整型。
    o 按八进制格式显示变量。
    t 按二进制格式显示变量。
    a 按十六进制格式显示变量。
    i 指令地址格式
    c 按字符格式显示变量。
    f 按浮点数格式显示变量。
  u表示一个地址单元的长度
    b表示单字节,
    h表示双字节,
    w表示四字节,
    g表示八字节

查看架构信息等命令 


$set arm disassembler
This commands selects from a list of disassembly styles. The "std" style is the standard style. 
$show arm disassembler
Show the current disassembly style. 
$set arm apcs32
This command toggles ARM operation mode between 32-bit and 26-bit. 
$show arm apcs32
Display the current usage of the ARM 32-bit mode. 
$set arm fpu fputype
This command sets the ARM floating-point unit (FPU) type. The argument fputype can be one of these:
auto
Determine the FPU type by querying the OS ABI. 
softfpa
Software FPU, with mixed-endian doubles on little-endian ARM processors. 
fpa
GCC-compiled FPA co-processor. 
softvfp
Software FPU with pure-endian doubles. 
vfp
VFP co-processor.

$show arm fpu
Show the current type of the FPU. 
$set arm abi
This command forces gdb to use the specified ABI. 
$show arm abi
Show the currently used ABI. 
$set arm fallback-mode (arm|thumb|auto)
gdb uses the symbol table, when available, to determine whether instructions are ARM or Thumb. This command controls gdbs default behavior when the symbol table is not available. The default is ‘auto’, which causes gdb to use the current execution mode (from the T bit in the CPSR register). 
$show arm fallback-mode
Show the current fallback instruction mode. 
$set arm force-mode (arm|thumb|auto)
This command overrides use of the symbol table to determine whether instructions are ARM or Thumb. The default is ‘auto’, which causes gdb to use the symbol table and then the setting of ‘set arm fallback-mode’. 
$show arm force-mode
Show the current forced instruction mode. 
$set debug arm
Toggle whether to display ARM-specific debugging messages from the ARM target support subsystem. 
$show debug arm
Show whether ARM-specific debugging messages are enabled.

切换汇编与源码调试

$set disassemble-next-line on
$set disassemble-next-line off
$show disassemble-next-line

调试子进程

set follow-fork-mode [parent|child]
parent: fork之后继续调试父进程,子进程不受影响。
child: fork之后调试子进程,父进程不受影响。

detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制:
set detach-on-fork [on|off]
on: 断开调试follow-fork-mode指定的进程。
off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。

 

© 著作权归作者所有

stormm
粉丝 32
博文 22
码字总数 14557
作品 0
昌平
运维
私信 提问
Linux基础 30分钟GDB调试快速突破

引言 Linus心灵鸡汤   在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds   Unix 始于上个世纪60年代,在70年代得到了迅猛的发...

xumaojun
2018/04/23
0
0
OpenWRT开发之——远程debug

想要用gdb对OpenWrt进行远程调试。首先得在OpenWrt目标机上安装gdbserver。 其实在trunk路径下也有gdb的ipk安装包的,不信find一下。 [trunk]$ find bin/ -name "gdb*.ipk"bin/ar71xx/packag...

临峰不畏
2015/05/18
8.7K
9
GDB 调试 C++ 程序 core dump

前天晚上(2013.10.15)参加 Topcoder 竞赛时, 碰到一个比较没有头绪的问题, 想解法就想了半天, 写代码时又出了问题,以前在 Visual Studio 下图形化调试的习惯根深蒂固, GDB 又不熟悉, 所以只能...

sailtseng
2013/10/18
7.5K
0
27款反汇编/调试器/静态和动态分析工具

  【IT168 技术】本文从github上收集了27款实用的反汇编、调试器、静态和动态分析工具,文中的工具在《Awesome Windows Exploitation》项目中由开发者enddo总结。 ▲   angr:来自UCSB的...

it168网站
2017/01/24
0
0
Debugging with GDB 用GDB调试多线程程序

Debugging with GDB http://www.delorie.com/gnu/docs/gdb/gdb_25.html GDB调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧。 先介绍一下GDB多线...

AlphaJay
2011/07/22
291
0

没有更多内容

加载失败,请刷新页面

加载更多

Tensorflow 2.0安装

Tensorflow2.0安装环境: Ubuntu 16.04或更高(64位) Windows 7或者更高(64位,且支持python3) 安装Tensorflow 2.0 GPU版本的需要安装NVIDIA相关软件包: NVIDIA驱动 :版本必须410.x或更...

JosiahMg
22分钟前
4
0
TL138/1808/6748F-EasyEVM开发板硬件、CPU、FLASH、RAM

TL138/1808/6748F-EasyEVM是广州创龙基于SOM-TL138/SOM-TL1808/SOM-TL6748F核心板开发的一款开发板。由于SOM-TL138/SOM-TL1808/SOM-TL6748核心板管脚兼容,所以此三个核心板共用同一个底板。...

Tronlong创龙
30分钟前
4
0
百度嵌入式AI解决方案EdgeBoard之内存驱动设计介绍

1. 背景介绍 由于 FPGA 具备可编程和高性能计算的特点,基于FPGA硬件的AI计算加速,正广泛地应用到计算机视觉处理领域。其中极具代表性的部署方式之一就是使用FPGA和CPU组合构成异构计算系统...

AI君
36分钟前
6
0
开放应用模型(OAM):全球首个云原生应用标准定义与架构模型

Kubernetes 项目作为容器编排领域的事实标准, 成功推动了诸如阿里云 Kubernetes (ACK)等云原生服务的迅速增长。但同时我们也关注到,Kubernetes 的核心 API 资源比如 Service、Deploymen...

Mr_zebra
39分钟前
4
0
《Linux操作系统-Exynos4412》编译和安装Busybox

开发环境:Exynos4412-iTOP-4412开发板 现在 Busybox 的配置已经完成了,接下来开始编译 Busybox,在 Ubuntu 的终端输入 “make”命令开始编译 Busybox,如下图。 下图为编译过程中的截图。 ...

书白
42分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部