GDB列出源码

  • 内容
  • 评论
  • 相关

在使用 GDB 调试程序时,我们会经常需要展示程序中的代码,但是打印出的代码可能和源文件中的不同,为什么这么说呢?我们在《GDB准备调试阶段》章节中讲到过 GCC 编译器允许-g-O选项同时使用,也就是说 GDB 可以调试优化后的程序。优化的程序中会在源文件中的某些地方改变,所以和编写的文件和程序执行的文件不一致是常见的。

在 GDB 中展示出代码行有很多的好处,其中最主要的好处就是方便调试。例如,我们需要在程序中的某一处设置断点,如果没有代码展示,会很难实现断点的准确定位。

list命令

展示程序中的代码行要使用 list 命令,命令的格式有很多,下面就是对这个命令的详细介绍。

1.不带参数的 list 命令的使用表示从当前行向下打印,默认显示 10 行代码。

注意:list 命令会记录打印的位置,如果是第一次使用 list 命令,那么会从程序的第一行开始打印;如果之前使用过该命令,list 就会从上次打印代码的最后一行的下一行开始打印。

2.标记中心行位置打印代码,命令格式展示如下:

list [location]

location 表示为程序中的位置,可以是行号、函数名、地址。例如:

(gdb) list 2                      //以第二行为中心行开始打印。    
(gdb) list func                 //以func函数所在行为中心行打印。
(gdb) list *0x1234             //以标记地址所在行为中心行打印。

3.指明 list 打印的开始位置和结束位置,命令格式展示如下:

list [first] , [last]

first 为打印的起始位置,last 表示打印的结束位置。如果不指明 first 的值表示从当前行开始打印。实例:

(gdb) list 1 , 5            //打印从第一行开始,到第五行结束。
(gdb) list  , 5               //打印从当前行开始,到第五行结束。

4.list 命令从当前行开始偏移,偏移量可以自己指定。命令格式展示如下:

list  (+/-)[num]

num 表示当前行的偏移量,+ 表示向下偏移,- 表示向上偏移。实例:

(gdb) list +2           //从当前行向下偏移 2 行
(gdb) list -2            //从当前行向上偏移 2 行

注意:如果程序运行到断点处使用 list 命令,GDB 会将断点处所在行设置为中心行打印代码。

设置 list 打印行数

在 GDB 中使用 list 命令默认打印的代码行数为 10 行,其实代码打印的行数是可以更改的,我们可以通过设置 GDB 中的 listsize 实现,命令格式如下:

set listsize [num]

num 表示设置的代码打印的行数。实例:

set listsize 5          //设置打印的行数为 5 行。
set listsize 6          //设置打印的行数为 6 行。

显示 listsize 的值可以使用命令:

show listsize

综合调试实例

文件代码展示:

#include <stdio.h>
#include <stdlib.h>

int add(int a,int b)
{
    return a + b;
}

int main(void)
{
    int a = 10; 
    int b = 20; 
    int c;
    c = add(a,b);
    printf("%d",c);
    return 0;
}

GDB调试:

本文标题:GDB列出源码

本文地址:http://www.hosteonscn.com/7949.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注