gdb带参数调试

转载http://blog.sina.com.cn/s/blog_4b6f784001011yvh.html
例子:

#include <stdio.h>
int main(int argc,char *argv[])
{
    int i = argc;
    printf("argc:%d\n",i);
        for(i = 0;i < argc;i++)
        printf("argv[%d]:%s\n",i,argv[i]);
        return 1;
}

输出:
[root@(none) ~]# gcc -g -o main main.c
[root@(none) ~]# ./main a b c
argc:4
argv[0]:./main
argv[1]:a
argv[2]:b
argv[3]:c
调试:

[root@(none) ~]# gdb main
GNU gdb Red Hat Linux (6.6-8.fc7rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) set args a b c
(gdb) r
Starting program: /root/main a b c
argc:4
argv[0]:/root/main
argv[1]:a
argv[2]:b
argv[3]:c
Program exited with code 01.
(gdb)

或者用 r a b c也可以的

<think> 首先,用户的问题是关于如何在GDB调试器中添加数进行调试。用户提供了几个引用,我需要考这些引用来生成回答。 用户指令回顾: - 使用中文回答。 - 结构清晰,逐步解决问题。 - 保证回答真实可靠。 - 系统级指令包括使用$...$表示行内数学表达式(但这里可能不常用,因为是调试主题),独立公式用$$...$$,但主题是GDB,数学表达式可能不相关。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。 用户提供的引用: - [1]: 介绍了两种方法:启动GDB时加数`gdb --args ./main argv[1] argv[2]`或先启动GDB再运行`run argv[1] argv[2]`。 - [2]: 提到三种方式:直接调试目标程序、附加进程、调试core文件。 - [3]: 详细解释了如何编译调试信息(-g数),并描述了三种启动GDB的方式:gdb <program>, gdb <program> core, gdb <program> <PID>。 - [4]: 是转载的,内容相似于[3]。 用户的核心问题:"我想查找gdb添加数进行调试的方法 请问gdb添加调试的方法"。所以,我需要专注于如何在GDB中添加命令行数给被调试的程序。 关键方法总结: 1. **使用`--args`数启动GDB时指定数**:如引用[1]和[3]所述。 - 示例:`gdb --args ./main argv[1] argv[2]` 2. **在GDB内部使用`run`命令指定数**:如引用[1]所述。 - 示例:先运行`gdb main`,然后在GDB提示符下输入`run argv[1] argv[2]` 3. **附加说明**:确保编译时添加`-g`数以包含调试信息(引用[3]中提到)。 回答结构: - 结构化清晰,逐步解释方法。 - 使用中文。 - 末尾添加引用标识。 - 最后生成相关问题。 逐步回答: 1. **介绍目的**:解释为什么需要添加数。 2. **方法1:启动GDB时添加数**。 3. **方法2:在GDB内部使用run命令添加数**。 4. **注意事项**:如编译时添加-g数。 5. **总结**。 生成相关问题: - 基于主题,生成相关的问题,如其他调试技巧、优化等。 完整回答框架: - 开头:直接回答用户问题。 - 主体:分步骤描述方法。 - 结尾:生成相关问题。 </think> ### GDB添加调试的方法 在使用GDB调试C/C++程序时,为被调试程序添加命令行数(如命令行选项或输入数)是常见需求。这可以通过两种主要方式实现:启动GDB时直接指定数,或在GDB内部交互式指定数。下面我将逐步解释这些方法,确保编译时使用`-g`数添加调试信息(否则GDB无法显示变量名称和源码上下文)[^3]。以下是具体步骤: #### 步骤1: 确保编译程序时包含调试信息 在调试前,必须使用编译器(如gcc/g++)的`-g`选项编译程序,以嵌入调试符号: ```bash gcc -g main.c -o main # 对于C程序 g++ -g main.cpp -o main # 对于C++程序 ``` 如果不加`-g`,GDB只能显示内存地址,无法查看函数名或变量名[^3]。 #### 步骤2: 添加数的两种主要方法 以下方法适用于需要传递命令行数(如`./main arg1 arg2`)的情况: 1. **启动GDB时直接添加数(推荐)** 使用`gdb --args`命令,在启动GDB时同时指定被调试程序数: ```bash gdb --args ./main argv[1] argv[2] # argv[1]和argv[2]是传递给main的数 ``` 示例: ```bash gdb --args ./myapp --input=test.txt --output=result.txt ``` 启动后,GDB会自动加载程序,输入`run`命令即可执行程序并传递数[^1][^3]。 2. **在GDB内部使用`run`命令添加数** 先启动GDB,然后在交互会话中通过`run`命令指定数: ```bash gdb main # 启动GDB,加载程序 (gdb) run argv[1] argv[2] # 在GDB提示符下运行程序并添加数 ``` 示例: ```bash (gdb) run -d 3 -v ``` 如果程序已运行,可以使用`start`命令重新开始调试[^1][^2]。 #### 步骤3: 其他调试场景的处理 - **调试已运行进程**:使用`gdb attach <pid>`附加到进程ID(PID),然后通过`run`重传数(需先中断程序)[^2][^3]。 - **调试core文件**:使用`gdb <program> core`加载核心转储文件,数通常在程序崩溃前已设置[^2][^3]。 - **设置环境变量**:在GDB内部使用`set args`预设数(例如:`(gdb) set args arg1 arg2`),然后运行`run`[^3]。 #### 注意事项 - **数格式**:数应以空格分隔;字符串数需加引号(如`run "input.txt"`)。 - **调试效率**:`--args`方法适合一次性传递数,而`run`方法适合多次测试不同数组合。 - **验证数**:在GDB中,使用`show args`命令查看当前设定的数[^1][^3]。 通过以上方法,您可以灵活地为GDB调试添加数,确保程序在调试环境下正确接收输入[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值