调试器(GDB)的基本使用方法(之二)

原创 2013年12月06日 08:09:28

attach到进程
使用的文件:
/*filename:    test_attach.c
*description: This file used to test the attach command of gdb
*author:      Howard
*date:        2013-11-25
*version:     v1.0
*/

#ifndef ATTACHTEST
#define ATTACHTEST

#include <stdio.h>
#include <unistd.h>

#endif

int main(int argc, char *argv[])
{
        while(1){
                sleep(10);
        }

        return 0;
}


使用下面的方法编译并运行:
$ gcc -Wall -O2 -g -o test_attach test_attach.c
$ ./test_attach &
[1] 2901
$ ps aux | grep test_attach
<username>  2901  0.0  0.0   2000   284 pts/2    S    19:20   0:00 ./test_attach
<username>  3021  0.0  0.1   6076   836 pts/2    S+   19:21   0:00 grep --color=auto test_attach
使用attach命令:
(gdb) attach 2901
Attaching to process 2901
Reading symbols from /home/shuaihua/test_attach...done.
Reading symbols from /lib/i386-linux-gnu/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
0x00a1c416 in __kernel_vsyscall ()
注意:这个地方可能需要超级用户权限来执行,我使用的ubuntu12.04测试的。
使用显示栈帧可以看进程是怎样陷入等待状态的:
(gdb) bt
#0  0x00a1c416 in __kernel_vsyscall ()
#1  0x004d9f00 in nanosleep () from /lib/i386-linux-gnu/libc.so.6
#2  0x004d9d1f in sleep () from /lib/i386-linux-gnu/libc.so.6
#3  0x0804834c in main (argc=1, argv=0xbfdab6c4) at test_attach.c:19
可以看出程序调用了sleep()函数而键入等待装填的从源文件中可以找到此行代码。
使用info proc可以查看进程信息:
(gdb) info proc
process 2901
cmdline = './test_attach'
cwd = '/home/<username>'
exe = '/home/<username>/test_attach'
最后使用detach命令可以将gdb与进程分离。
(gdb) detach
Detaching from program: /home/<username>/test_attach, process 2901

条件断点
条件断点仅在特定条件下中断。
格式:
     break 断点 if 条件
     condition 断点编号 条件——给指定的断点添加或删除触发条件
如果条件为真则暂停运行。
反复执行
格式:
     ignore 断点编号 次数
在编号指定的断点、监视点(watchpoint)或捕获点(catchpoint)忽略指定的次数。
continue与ignore一样,有类似的功能。
执行指定次数的命令:
格式:
     continue 次数
     step 次数
     stepi 次数
     next 次数
     nexti 次数
finish命令执行完当前函数后暂停,until命令执行完当前函数等代码块后暂停,如果是循环,则执行完尊换后暂停。
格式:
     finish
     until
     until 地址

删除断点和禁用断点
clear可以删除已定义的断点,disable可以临时禁用断点。
格式:
     clear
     clear 函数名
     clear 行号
     clear 文件名:行号
     clear 文件名:函数名
     delete [breakpoints] 断点编号
格式:
     disable [breakpoints]
     disable [breakpoints] 断点编号
     disable display 显示编号
     disable mem 内存区域
如果不指定断点号,则表示禁用所有断点。
     enable [breakpoints]
     enable [breakpoints] 断点编号
     enable [breakpoints] once 断点编号
     enable [breakpoints] delete 断点编号
     enable display 显示编号
     enable mem 内存区域
once是指定的断点只启用一次,delete是在暂停后删除断点。

断点命令

在断点中断时自动执行的命令。
格式:
     commands 断点编号
          命令
          ......
     end
$ gdb
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>.
(gdb) file staticvariable
Reading symbols from /home/shuaihua/CLan/staticvariable...done.
(gdb) info b
No breakpoints or watchpoints.
(gdb) b 28 if k==100
Breakpoint 1 at 0x80483a5: file staticvariable.c, line 28.
(gdb) command 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>p k
>end
(gdb) b main
Breakpoint 2 at 0x8048359: file staticvariable.c, line 19.
(gdb) command 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>p j
>end

(gdb) run
Starting program: /home/shuaihua/CLan/staticvariable 

Breakpoint 2, main () at staticvariable.c:19
19     {
$1 = 0
(gdb) n
28          printf("i = :%d\n", i);
(gdb) n
19     {
(gdb) n
28          printf("i = :%d\n", i);
(gdb) n
19     {
(gdb) n
28          printf("i = :%d\n", i);
(gdb) n
i = :10
j = :1

Breakpoint 1, main () at staticvariable.c:32
32     }
$2 = 100
(gdb) n
0x0014c4d3 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6
(gdb) n
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 2950) exited normally]

/* FileName:    staticvariable.c
* Description: 用来测试静态变量的输出结果。
* Author:      Howard
* Date:        2013-12-05
* Version:     v1.0
*/

#include <stdio.h>

static int j = 0;

int func1(void)
{
     static int i = 0;
     i ++;
     return i;
}

void func2(void)
{
     j = 0;
     j ++;
} 

int main(void)
{
     int k;
     int i;
     
     for (k=0; k<10; k++){
          i = func1();
          func2();
     }
     k = 100;
     printf("i = :%d\n", i);
     printf("j = :%d\n", j);
     
     return 0;
}



常用命令及省略形式
命令 简写形式 说明
backtrace bt、where 显示backtrace
break b 设置断点
continue c 继续运行
delete d 删除断点
finish   运行到函数结束处
info breakpoints info b 显示断点信息
next n 执行下一行
print p 显示表达式
run r 运行程序
step s 一次执行一行,但是可以进入到函数内部(这点与next不同)
x   显示内存内容
until u 执行到指定的行
其他命令
命令 简写形式 说明
directory dir 插入目录
disable dis 禁用断点
down do 在当前调用栈中选择要显示的栈帧
edit e 编辑问价或函数
frame f 选择要显示的栈帧
forward-search fo 向前搜索
generate-core-file gcore 生成内核转储
help h 显示帮助一栏
info i 显示信息
list l 显示函数或行
nexti ni 执行下一行(以汇编代码为单位)
print-object po 显示目标信息
sharedlibrary share 加载共享库的符号
stepi si 执行下一行


版权声明:本文为博主原创文章,未经博主允许不得转载。

调试器(GDB)的基本使用方法(之一)

使用gcc的-g选项生成调试信息: $ gcc -Wall -O2 -g sourcefile         注意:-O2的'O'是大写字母,不是零。 编译: $ gcc ...
  • cnxxrj
  • cnxxrj
  • 2013年11月22日 17:01
  • 1606

调试器(GDB)的基本使用方法(之一)

调试流程: 1、   带着调试选项编译、构建调试对象 2、   启动调试器 1)        设置断点 2)        显示栈帧 3)        显示值 4)        继续...
  • zhenhuibox
  • zhenhuibox
  • 2015年05月21日 14:46
  • 238

调试器(GDB)的基本使用方法(之三)

值的历史 print命令显示过的值会被记录下来,这些值可以其他表达式中使用。 我们使用的源文件为: /* Filename: contains3.c * Description: ...
  • cnxxrj
  • cnxxrj
  • 2013年12月06日 08:09
  • 1339

gdb调试工具的使用

1.gdb介绍GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非...
  • Linux_forker
  • Linux_forker
  • 2015年07月24日 01:05
  • 1120

GCC编译详解+Gdb调试器+Make工程管理器

Linux下编程的重要部件((摘自 http://www.cnblogs.com/azraelly/archive/2012/07/07/2580839.html ,主要涉及了gcc、gdb、Make...
  • rongwenxiao
  • rongwenxiao
  • 2016年07月09日 17:09
  • 1308

【C语言】gdb调试器入门

前言    作为一名计算机系的学生,接触编程也有两年时间了,一个比较深的感受:光会码代码是远远不够的,调试代码的能力十分重要!     经常有同学说,这个我知道思路,代码也打出来了,为什么跑出来的结...
  • jiange_zh
  • jiange_zh
  • 2015年09月21日 10:46
  • 752

gdb基本使用方法及常用命令

示例代码 plain copy gdbtest.c   -----------------------   #include    #include ...
  • u013525455
  • u013525455
  • 2016年10月14日 10:23
  • 1315

Linux下调试器 GDB和工程管理器MAKE 应用详解!

调试器 GDB   1.启动被调试程序   2.设置断点   3.查看断点处变量的值     调试选项  -g            gcc -g text.c -o text      ...
  • njcyp123456789
  • njcyp123456789
  • 2016年11月14日 22:22
  • 150

QEMU+GDB调试方法

两年前调试usb/ip开源项目时,就曾用虚拟机远程调试过Windows和Linux系统内核,当时在VMware Workstation上创建两个虚拟机进行调试,也没有记录下如何配置调试,只是大体的还记...
  • flyforfreedom2008
  • flyforfreedom2008
  • 2015年04月16日 21:42
  • 1891

DDD进行调试 介绍

DDD进行调试 介绍标题:嵌入式开发中使用DDD进行调试2008-01-17 19:57:28        在嵌入式程序开发过程中,程序员要进行大量的调试,以此验证程序的正确性,修改潜在的错误。调试...
  • Augusdi
  • Augusdi
  • 2014年10月12日 16:37
  • 1943
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:调试器(GDB)的基本使用方法(之二)
举报原因:
原因补充:

(最多只允许输入30个字)