Linux基础(03)gdb调试

1. 安装GDB增强工具 (gef)

  * GDB的版本大于7.7

  * wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh

  * 确保网络连通 并且成功更新ubuntu (更新source.list 使用apt-get update)

2. GDB安装插件(在root权限安装,用户权限使用不了需要在用户权限下安装)

  git clone https://github.com/gatieme/GdbPlugins.git ~/GdbPlugins  (安装gdb的Python脚本插件)

  切换gdb模式 :

  echo "source ~/GdbPlugins/peda/peda.py" > ~/.gdbinit    (默认打开gdb插件是pada)  倾向于破解和逆向

  echo "source ~/GdbPlugins/gef/gef.py" > ~/.gdbinit      倾向于debug 逆向

  echo "source ~/GdbPlugins/gdbinit/gdbinit" > ~/.gdbinit    个人定制

3.Linux程序发布流程

  * 确定程序是否存在符号表

    readelf -s test-1

  * 生成符号表

    objcopy --only-keep-debug test-1 test-1.symbol

  * 生成发布程序

    objcopy --strip-debug test-1 test-release

  * 使用符号表进行程序debug

    gdb -q --symbol=test-1.symbol --exec=test-release

4.gdb语法的使用

  set listsize num 设置 l 的显示行数

  list/l (code/num) 查看某个函数代码或者查看某行代码. 查看其它文件的代码 l xxx.c:(code/num)

  break/b num 打断点 条件断点 b num if var== 也可以断到某个函数上b func

  continue/c 跳到下一个断点

  disable num 使断点失效 enable num 使断点重新有效

  run/r 运行程序

调试已运行的程序

  info breakpoints 查看断点 delete/d num 删除断点列表的某个断点

  print/p code 调试时打印某个变量的值 也可以选择打印的方式 如: p/d code 打印十进制的结果 p/s 打印字符串的结果

  p var=100 修改内存

  step/s 执行下一句代码有函数进入函数

  next/n 执行下一句代码有函数也跳过

  until/u 跳出当前循环

  finish 退出当前函数

  info locals 查看当前函数中的全部局部变量

  bt 查看函数调用栈 如: 进入某个函数时bt一下可以知道哪个函数调用了当前进入的函数 或者 可以查看处在哪个函数中

  info frame 打印当前栈里所以的信息

  x &code 查看某个变量的内存地址

  #观察点

    watch var/add 观察内存是否被改变如果改变则自动断点

    gdb就近原则 如果有变量重名 想查看任意函数内 的变量 watch func::var

    info watchpoints 查看观察点列表

    rwatch var/add 观察内存是否被读取如果被读取则断点

  #设置捕捉点

    catch event/throw

    throw 抛出一个C++的异常 catch throw

    catch 捕捉一个C++的异常 catch catch

    exec 调用系统调用exev时停止 catch exec

    exec 在一个进程中启动另外一个程序

    fork 调用系统调用fork时停止 catch fork

    load/load libname 载入动态链接库时 catch load / catch load libname

    unload

  #搜索源代码

    search var/func 内存搜索 只有调用了函数或存在于内存才能搜索到

    reverse-search var/func 全文搜索 不占用内存也能搜索只要在代码段

  #查看内存

    x/nfu

   n是一个正整数表示内存的长度配合u n代表数量u代表单位(字节)

   f代表显示格式和print占位符相同

      x 十六进制格式显示

      d 十进制格式显示

      u 十六进制格式显示无符号整型

      o 八进制格式显示

      t 二进制格式显示

      a 十六进制格式显示

      c 按字符格式显示

      f 按浮点数格式显示

   u可以用下面的字符来代替:

      b 表示单字节

      h 表示双字节

      w 表示四字 节

      g 表示八字节

   十六进制两位数一个字节

      如:x/3uh 0x80494a4 往后的三个无符号的十六进制只显示两个字节的地址

      x/3uh 0x80494a4 1 0 16

      x/3xh 0x80494a4 0x0001 0x0000 0x0010

   查看数组地址 p*[email protected]

  #插入命令

    在触发某些断点是执行插入的命令并不是真的在源代码上插入

    conmades bnum

    ...

    ...

    end

一般都是没有gef等脚本时使用的

################################################################################

5.gdb多进程多线程调试

 1 int main()
 2
 3 {
 4     pid_t pid = fork();//创建子进程
 5     if(pid == -1)
 6     {
 7         perror("fork error");
 8         return -1;
 9     }
10     else if(pid == 0)//child
11     {
12         printf("i am a child:my pid is %d,my father is%d\n",getpid(),getppid());
13     }
14     else//father
15     {
16         printf("i am a father:my pid is %d\n",getpid());
17         wait(NULL);//等待子进程
18     }
19     return 0;
20 }

##################进程间是完全独立互不影响的但可以通信

  fork创建一个完全和父进程一样的子进程,两个进程并行执行,执行先后随机看CPU的调度

     父进程的fork返回值是子进程的pid号

     子进程的fork返回值是0

     wait阻塞函数 等待子进程退出后 父进程才退出

  ##确定gdb中的进程跟踪模式

     show/set follow-fork-mode parent/child 跟踪的父子进程间的切换

     detach-on-fork

     show detach-on-fork和跟踪的进程有关,只负责on和off , 跟踪父进程则负责父进程的on/off , 跟踪子进程则负责子进程的on/off

      parent       on         只调试父进程,子进程正常运行

      child       on         只调试子进程,父进程正常运行

      parent       off         同时调试两个进程,子进程暂停在fork位置

      child        off         同时调试两个进程,父进程暂停在fork位置

    shell ps -ef | grep num/programName 查看指定pid或程序名的进程 shell ps -A查看所有进程

  ##进程间的切换 在detach off 的时候使用切换调试的进程

    info inferiors   查看调试的进程

    inferiors num   切换调试的进程

  #进程的管理

   add-inferior [-copies n] 复制一个进程 -copies + 进程列表num

   [-exec executable] 新开一个进程 + 程序的路径

   detach

   kill

   remove-inferior 删除进程

###########多线程

  show/set scheduler-locking off不锁定任何线程 on锁定其他线程只有当前线程执行 step只有被调试线程运行

  gdb版本过低不一定能锁定

  info thread 查看所有线程

  threads num 切换到指定线程

 

1 int main()
2 {
3     pthread_t tid1,tid2;
4     pthread_create(&tid1,NULL,thread1,NULL);//创建线程1
5     pthread_create(&tid2,NULL,thread2,NULL);//创建线程2
6     pthread_join(tid1,NULL);//等待线程1
7     pthread_join(tid2,NULL);//等待线程2
8     return 0;
9 }

切换到指定线程后调试,断点打在线程函数上不妨碍主线程main的执行所以会有三个线程

原文地址:https://www.cnblogs.com/yxnrh/p/11490902.html

时间: 2024-11-05 23:22:48

Linux基础(03)gdb调试的相关文章

linux基础2——gdb调试器

gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功: 4." l " (小写l)命令可以查看当前代码是否是要执行的代码: 5.断点 b 行号/函数名字——作用是程序执行过程中会自动在断点处暂停,等待指令 info b—— 查看断点列表 d 编号——删除指定编号的断点 6.执行程序 r 回车——程序启动,执行到代码中第一个出现断点处暂停 7

linux应用开发-gdb调试

linux应用开发-gdb调试 一 gdb概念 gdb是GNU开发的linux下的调试工具 二 基本使用过程 1 进入调试程序的模式: gcc -g test.c -o test.out 2 开启gdb:            gdb test.out 3 运行程序:           run(r) 4 退出:               quit(q) 5 也可以先进入gdb在执行file装载要调试的文件 三 基本命令 1 设置断点:break(b) 行号 或 break(b)文件名:行号

【转】 linux编程之GDB调试

GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能: 1 在程序中设置断点,当程序运行到断点处暂停 2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显示出来 3 单步执行 4 运行时修改变量的值 5 跟踪路径 6 线程切换 等等 下面以以下程序为例 当我们要使用GDB进行程序的调试时,在用GCC编译时需要加上-g,如下: GDB之所以能够进行程序的调试也是在于进行编译时的-g选项,当设置了这个选项的时候,GCC会向程序中塞入一下信息,作为GDB调

linux学习之四---gdb调试

在Linux应用程序开发中,最常用的调试器是gdb. 一.启动和退出gdb gdb调试的对象是可执行文件,而不是程序的源代码.如果要使一个可执行文件可以被gdb调试,那么使用编译器gcc编译时需要加入-g选项,-g选项告诉gcc在编译时加入调试信息,这样gdb才可以调试这个被编译的程序. 1.编译test.c源程序 gcc -g test.c -o test ./test test.c中的源码为: #include<stdio.h> int get_sum(int n) { int sum=0

Linux下使用GDB调试应用程序示例

GDB概述 ---- GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓"寸有所长,尺有所短"就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式)

linux应用程序设计--GDB调试

GDB简介:GDB是GNU发布的一款功能强大的程序调试工具,GDB主要完成下面三个方面功能: 一.GDB的使用操作 1.启动被调试程序. 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检查程序状态(如变量值). GDB调试实例: 1.在linux下编写test.c程序: 1 #include <stdio.h> 2 3 int main() 4 { 5 int i; 6 long result = 0; 7 for(i=0;i<100;i++) 8 { 9 result

Linux系统下GDB调试

GDB 一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或i) locals 查看当前栈帧局部变量的值 list(或l) 列出源代码,接着上次的位置往下列,每次列10行 list 行号 列出从第几行开始的源代码 list 函数名 列出某个函数的源代码 next(或n) 执行下一行语句 print(或p) 打印表达式的值,通过表达式可以修改变量的值或

Linux中的gdb调试

一.整体大纲 二.gdb调试 1. 启动gdb start -- 只执行一步    n -- next    s -- step(单步) -- 可以进入到函数体内部    c - continue -- 直接停在断点的位置 2. 查看代码: l -- list    l 10(函数名)    l filename:行号(函数名) 3. 设置断点: 设置当前文件断点:    b -- break    b 10(函数名)    b fileName:行号(函数名)    设置指定文件断点:    

Big-data:Linux基础(03)

shell基础知识 什么是Shell Shell是命令解释器(command interpreter),是Unix操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作系统内核(kernel)能够识别的指令,并且操作系统内核执行完将返回的输出通过shell再呈现给用户,下图所示用户.shell和操作系统的关系: Shell也是一门编程语言,即shell脚本,shell是解释执行的脚本语言,可直接调用linux命令. .java -> .class 一个系统可以存在