• gdb gdbtui


    1. gdbtui

    1. 打开tui模式
      gdbtui a.out
      gdb -tui a.out

    2. 调试一个正在运行的进程
      gdb -p pid

    在linux自带的终端里是正常显示的,但是在securecrt里面,可能由于编码的问题,边缘会有些乱码,不过不影响使用(如果你的程序有错误输出,会扰乱整个界面,所以在调试的时候,建议添加2>/dev/null,这样的话基本可用)

    (gdb) info win  查看当前focus
            SRC     (36 lines)  <has focus>
            CMD     (18 lines)
    (gdb) fs next  切换focus
    Focus set to CMD window.
    (gdb) info win 
            SRC     (36 lines)
            CMD     (18 lines)  <has focus>
    (gdb) fs SRC  切换指定focus
    Focus set to SRC window.
    (gdb)

    上面是src窗口,下面是cmd窗口,默认focus在src窗口的,这样的话上下键以及pagedown,pageup都是在移动显示代码,并不显示上下的调试命令

    2. gdb常用命令

    start               //开始执行程序,停在main函数第一行语句前面等待命令
    directory path      //添加一个路径,解决No such file or directory
    print(p)            //打印变量内容
    info(i) cmd         //列出指令信息
    delete [num]        //删除断点
    display var         //跟踪查看一个变量,每次停下来都显示它的值(取消undisplay)
    backtrace(bt)       //查看各级函数调用及参数
    set var=            //修改变量的值
    sharedlibrary lib   //调试动态库
    until [line]        //结束当前循环(,并跳到指定行)
    finish              //跳出当前函数
    return val          //跳出当前函数,并且返回指定值
    i locals            //当前函数局部变量
    cd                  //切换目录
    pwd                 //显示当前路径
    shell cmd           //执行shell命令
    make                //调试中编译程序

    3. gdb传入参数

    (gdb) r 2 3
    相当于:
    # ./a.out 2 3

    4. 格式数据

    (gdb) p/x temp[35]
    $29 = 0xd

    x 按十六进制格式显示变量
    d 按十进制格式显示变量
    u 按十六进制格式显示无符号整型
    o 按八进制格式显示变量
    t 按二进制格式显示变量
    a 按十六进制格式显示变量
    c 按字符格式显示变量
    f 按浮点数格式显示变量

    5. core文件

    # gdb a.out core 
    where 

    6. 调试子进程

    (gdb) set follow-fork-mode child 

    这样就可以断到子进程里面了,否则断点无效

    7. 线程调试
    info threads:显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程
    thread ID:切换当前调试的线程为指定ID的线程

    (gdb) i threads 
     * 2 Thread 0x7ffff7fe9710 (LWP 70799)  0x0000003249aa6820 in sleep () from /lib64/libc.so.6
      1 Thread 0x7ffff7feb700 (LWP 70797)  main () at thread.c:26
    (gdb) t 1
    [Switching to thread 1 (Thread 0x7ffff7feb700 (LWP 70797))]#0  main () at thread.c:26
    26              while(1);
    (gdb) i threads 
      2 Thread 0x7ffff7fe9710 (LWP 70799)  0x0000003249aa6820 in sleep () from /lib64/libc.so.6
     * 1 Thread 0x7ffff7feb700 (LWP 70797)  main () at thread.c:26
    (gdb) set scheduler-locking off|on|step

    多线程同时执行一段代码。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行

    8. watch
    watch通常需要和break,run,continue联合使用

    (gdb) watch a              //观察a的值,当有变化时,停止
    (gdb) watch *(long*)(a+4)

    9. break

    (gdb) b main
    (gdb) b test.c:main
    (gdb) b thread.c:26
    (gdb) b test::test

    10. 编译时附加编译选项

    # CFLAGS="-g -O0" CPPFLAGS=-g ./configure

    O0不进行编译优化,调试的时候就会顺畅了,运行流程不会跳来跳去的。发布项目的时候记得不要在使用 -O0参数项,gcc 默认编译或加上-O2优化编译会提高程序运行速度
    前提:你的可执行文件和源码是一一对应的

    当然,你不加优化也可以,直接-g即可

    11. 如果出现如下错误
    GDB调试时,提示动态库搜索路径有误。设置动态库搜索路径即可
    应用如下命令:set sysroot、set solib-absolute-prefix或set solib-search-path
    区别:

    • set sysroot 与 set solib-absolute-prefix 是同一条命令
    • set solib-search-path可设置多个搜索路径,路径之间以“冒号”分隔
    • solib-absolute-prefix设置库的绝对路径;solib-search-path绝对路径和相对路径均可
  • 相关阅读:
    Arm宣布将在Linux中应用事务内存扩展支持
    企业上云哪种形式的云更适合?
    AT&T推出云5G网络开源工具Airship
    GitHub源码攻击事件
    你应该选择哪种树莓派?
    Electron 5.0 发布
    Redox OS 发布 0.5 版
    经典的网络安全技术
    inux下:热插拔和模块是什么
    微软宣布全新命令行+脚本工具:PowerShell 7
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709921.html
Copyright © 2020-2023  润新知