GDB运行程序

当以“gdb + 程序名”的格式启动 gdb 后,gdb 会在 PATH 路径和当前目录中搜索和命令行中的程序名相同的文件。如何确定 gdb 是否读取到源文件,可使 list 命令(可以缩写成 l),看 gdb 是否可以读出程序的源代码。

程序运行阶段可能会出现很多问题,导致程序不能正常运行,例如,程序运行需要动态传入参数或者是程序在调试阶段路径发生改变等等,这些都是常见的问题。如何解决这类问题,可以通过设置程序的属性。

设置程序的属性

1.程序的运行参数。

set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。

2.运行环境

path<dir>可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname[=value]设置环境变量。如:set env USER=hchen
show environment[varname]查看环境变量

3.工作目录

cd <dir> 相当于 shell 的 cd 命令。
pwd 显示当前的工作目录。

4.程序的输入输出

info terminal 显示程序用到的终端的模式
使用重定向空值程序输出。如 run>outfile
tty 命令可以指定写输入输出的终端设备。如 tty /dev/ttyb

实例:创建一个C语言程序,代码实现从命令行传递参数。

程序源代码展示如下:

#include <stdio.h>
 
int main(int argc,char *argv[])
{
       If(argc < 3)
              return -1;
       char *arg1 = argv[1];
       char *arg2 = argv[2];
       printf(“arg1 = %s\n”,arg1);
       printf(“arg2 = %s\n”,arg2);
       return 0;
}

编译文件:

gcc -g test.c -o test

在 shell 命令行中为程序传递参数:

./test hello

显示运行的结果为:

Hello
World

使用GDB调试程序:

(gdb) run boy girl        //使用命令传递参数,运行程序使用 run 命令
Starting program: /home/wjc/hsxy/lianxi/10/test/a.out boy girl
arg1 = boy
arg2 = girl
[Inferior 1 (process 2910) exited normally]

(gdb) run               //默认会使用上一次 run 命令的参数
Starting program: /home/wjc/hsxy/lianxi/10/test/a.out boy girl
arg1 = boy
arg2 = girl
[Inferior 1 (process 2917) exited normally]

(gdb) set args               //置空参数列表
(gdb) show args
Argument list to give program being debugged when it is started is "".

(gdb) set args  1 2       //设置参数为1 2
(gdb) show args           //显示参数
Argument list to give program being debugged when it is started is "1 2".

(gdb) show environment PATH                        //显示已经设置的所有的环境变量
PATH=/home/wjc/s5p6818sdk_lzy1/Linux/src/uboot/tools:/opt/toolschain/4.5.1/bin:/home/wjc/bin

(gdb) set environment USER = wjc                 //设置用户为wjc
(gdb) unset environment PATH                     //删除PATH这个命令和“set environment PATH =“效果是等价的。
(gdb) cd hsxy/                            //切换路径为hsxy Working directory /home/wjc/hsxy
(gdb) pwd                             //显示当前工作路径      
Working directory /home/wjc/hsxy