首页 > 其他分享 >GDB全过程详细讲解

GDB全过程详细讲解

时间:2022-10-31 20:47:19浏览次数:88  
标签:info 0x1000 2.9 gdb GDB 全过程 讲解 堆栈 hello

摘自:https://blog.csdn.net/guo_lei_lamant/article/details/83787730

 

4. 堆栈

查看调用堆栈(call stack)无疑是调试过程中非常重要的事情。

(gdb) where # 查看调用堆栈 (相同作用的命令还有 info s 和 bt)

#0 test (a=4096, b=8192) at hello.c:5
#1 0x0804843b in main () at hello.c:13

(gdb) frame # 查看当前堆栈帧,还可显示当前代码

#0 test (a=4096, b=8192) at hello.c:5
5 int c = a + b;

(gdb) info frame # 获取当前堆栈帧更详细的信息

可以用 frame 修改当前堆栈帧,然后查看其详细信息。

(gdb) frame 1

#1 0x0804843b in main () at hello.c:13
13 int c = test(a, b);

(gdb) info frame

 5. 变量和参数

(gdb) info locals # 显示局部变量

c = 0

(gdb) info args # 显示函数参数(自变量)

8. 进程

查看进程相关信息,尤其是 maps 内存数据是非常有用的。

(gdb) help info proc stat

Show /proc process information about any running process.
Specify any process id, or use the program being debugged by default.
Specify any of the following keywords for detailed info:

mappings – list of mapped memory regions.
stat – list a bunch of random process info.
status – list a different bunch of random process info.
all – list all available /proc info.

(gdb) info proc mappings # 相当于 cat /proc/{pid}/maps

 

process 22561
cmdline = ‘/home/yuhen/Learn.c/hello’
cwd = ‘/home/yuhen/Learn.c’
exe = ‘/home/yuhen/Learn.c/hello’
Mapped address spaces:

    Start Addr   End Addr       Size     Offset objfile
     0x8048000  0x8049000     0x1000          0       /home/yuhen/Learn.c/hello
     0x8049000  0x804a000     0x1000          0       /home/yuhen/Learn.c/hello
     0x804a000  0x804b000     0x1000     0x1000       /home/yuhen/Learn.c/hello
     0x8a33000  0x8a54000    0x21000  0x8a33000           [heap]
    0xb7565000 0xb7f67000   0xa02000 0xb7565000
    0xb7f67000 0xb80c3000   0x15c000          0      /lib/tls/i686/cmov/libc-2.9.so
    0xb80c3000 0xb80c4000     0x1000   0x15c000      /lib/tls/i686/cmov/libc-2.9.so
    0xb80c4000 0xb80c6000     0x2000   0x15c000      /lib/tls/i686/cmov/libc-2.9.so
    0xb80c6000 0xb80c7000     0x1000   0x15e000      /lib/tls/i686/cmov/libc-2.9.so
    0xb80c7000 0xb80ca000     0x3000 0xb80c7000
    0xb80d7000 0xb80d9000     0x2000 0xb80d7000
    0xb80d9000 0xb80da000     0x1000 0xb80d9000           [vdso]
    0xb80da000 0xb80f6000    0x1c000          0      /lib/ld-2.9.so
    0xb80f6000 0xb80f7000     0x1000    0x1b000      /lib/ld-2.9.so
    0xb80f7000 0xb80f8000     0x1000    0x1c000      /lib/ld-2.9.so
    0xbfee2000 0xbfef7000    0x15000 0xbffeb000           [stack]</pre>


9. 线程

可以在 pthread_create 处设置断点,当线程创建时会生成提示信息。

(gdb) c

Continuing.
[New Thread 0xb7e78b70 (LWP 2933)]

(gdb) info threads # 查看所有线程列表

 

  • 2 Thread 0xb7e78b70 (LWP 2933) test (arg=0x804b008) at main.c:24
    1 Thread 0xb7e796c0 (LWP 2932) 0xb7fe2430 in __kernel_vsyscall ()
    (gdb) where # 显示当前线程调用堆栈

#0 test (arg=0x804b008) at main.c:24
#1 0xb7fc580e in start_thread (arg=0xb7e78b70) at pthread_create.c:300
#2 0xb7f478de in clone () at …/sysdeps/unix/sysv/linux/i386/clone.S:130

(gdb) thread 1 # 切换线程

 

[Switching to thread 1 (Thread 0xb7e796c0 (LWP 2932))]#0 0xb7fe2430 in __kernel_vsyscall ()

(gdb) where # 查看切换后线程调用堆栈

 

#0 0xb7fe2430 in __kernel_vsyscall ()
#1 0xb7fc694d in pthread_join (threadid=3085405040, thread_return=0xbffff744) at pthread_join.c:89
#2 0x08048828 in main (argc=1, argv=0xbffff804) at main.c:36


10. 其他

调试子进程。

(gdb) set follow-fork-mode child


临时进入 Shell 执行命令,Exit 返回。

(gdb) shell


调试时直接调用函数。

(gdb) call test("abc")


使用 "--tui" 参数,可以在终端窗口上部显示一个源代码查看窗。

$ gdb --tui hello


查看命令帮助。

(gdb) help b


最后就是退出命令。

(gdb) q


和 Linux Base Shell 习惯一样,对于记不住的命令,可以在输入前几个字母后按 Tab 补全。

----------- 分隔线 ---------------

GDB 还有很多指令,功能也异常强大。不过对于熟悉了 VS 那种豪华 IDE 的人来说,这种命令行调试是种巨大的痛苦。尽管我个人建议多用 GDB,但也不反对用 GUI 调试器来加快调试进程。Nemiver 就不错,推荐一下。

 

标签:info,0x1000,2.9,gdb,GDB,全过程,讲解,堆栈,hello
From: https://www.cnblogs.com/LiuYanYGZ/p/16845694.html

相关文章

  • gdb 查看函数调用堆栈(frame概念)
    摘自:https://www.cnblogs.com/xiaoshiwang/p/12893748.html1,使用bt(backtrace)命令查看当前堆栈(gdb)bt#0muduo::Poller::poll(this=0x62e010,timeoutMs=10000,......
  • GDB 备忘
    objdump-dtarget反编译targetgdbtarget开始调试targetr(run)运行b(break)funName在函数funName处设置断点b0x000001在地址0x000001处设置断点i(info)b显示......
  • gdb
    断点设置断点break+offsetbreak-offset(在当前行号的前面或后面的offset行停住。)breakfilename:linenum在源文件filename的linenum行处停住。breakfilename:func......
  • java如何引用外部类(文末有视频讲解)
    导航​​步骤1全限定名​​​​步骤2编译,报错,欧耶~​​​​步骤3访问权限修饰符​​​​步骤4编译和运行Demo.java​​​​步骤5导入包​​​​步骤6导入静态方......
  • java访问权限讲解(文末有视频教程)
    导航​​步骤1图解​​​​步骤2public对于class是最常用的​​​​步骤3protected多用于继承的情况​​​​步骤4private一般就是用于属性​​​​步骤5企业中的......
  • java项目结构分类实战(文末有视频讲解)
    导航​​步骤1分包​​​​步骤2Application​​​​步骤3Customer​​​​步骤4Vip​​​​步骤5目录结构​​​​步骤6下载源码​​​​步骤7视频教程​​......
  • Java基础 -- 我是这么理解static关键字的(文末配讲解视频)
    static是java里面的关键字,主要用来修饰属性和方法。打上static标记后,就是静态的,不需要new就可以访问。导航​​假如一个方法没有用到this?​​​​static的意义​​​​stati......
  • Java多线程Thread详细讲解(万字教程)
    一、线程的基本概念线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它......
  • cximage功能讲解1
    CxImage的功能Constructors  构造函数Initialization  初始化File 文件操作,主要是编解码Generic 图像基本变化DSP 图像处理操作Painting 绘图操作Multiple......
  • C语言之入门讲解
    目录1C语言基础讲解1.1C语言历史1.2C语言特点1.3C语言程序结构1.3.1简单示例1.3.2编译&执行C程序2数据类型2.1概述2.2标识符2.3数据类型2.3.1整数类型2.3.2......