GDB调试程序(二)

以下文章转自陈皓CSDN博客: http://blog.csdn.net/haoel/article/details/2879

 


GDB的命令概貌
———————

启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示:

    /home/hchen> gdb
    GNU gdb 5.1.1
    Copyright 2002 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-suse-linux".
    (gdb) help
    List of classes of commands:

    aliases -- Aliases of other commands
    breakpoints -- Making program stop at certain points
    data -- Examining data
    files -- Specifying and examining files
    internals -- Maintenance commands
    obscure -- Obscure features
    running -- Running the program
    stack -- Examining the stack
    status -- Status inquiries
    support -- Support facilities
    tracepoints -- Tracing of program execution without stopping the program
    user-defined -- User-defined commands

    Type "help" followed by a class name for a list of commands in that class.
    Type "help" followed by command name for full documentation.
    Command name abbreviations are allowed if unambiguous.
    (gdb)

gdb的命令很多,gdb把之分成许多个种类。help命令只是例出gdb的命令种类,如果要 看种类中的命令,可以使用help <class> 命令,如:help breakpoints,查看设置断点的所有命令。也可以直接help <command>来查看命令的帮助。


gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,你可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。
   
    示例一:在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func
    (gdb) b func
    Breakpoint 1 at 0x8048458: file hello.c, line 10.
 
    示例二:敲入b按两次TAB键,你会看到所有b打头的命令:
    (gdb) b
    backtrace  break      bt
    (gdb)

    示例三:只记得函数的前缀,可以这样:
    (gdb) b make_ <按TAB键>
    (再按下一次TAB键,你会看到:)
    make_a_section_from_file     make_environ
    make_abs_section             make_function_type
    make_blockvector             make_pointer_type
    make_cleanup                 make_reference_type
    make_command                 make_symbol_completion_list
    (gdb) b make_
    GDB把所有make开头的函数全部例出来给你查看。

    示例四:调试C++的程序时,有可以函数名一样。如:
    (gdb) b 'bubble( M-?
    bubble(double,double)    bubble(int,int)
    (gdb) b 'bubble(
    你可以查看到C++中的所有的重载函数及参数。(注:M-?和“按两次TAB键”是一个意思)

要退出gdb时,只用发quit或命令简称q就行了。

 

GDB中运行UNIX的shell程序
————————————

在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成:

    shell <command string>
    调用UNIX的shell来执行<command string>,环境变量SHELL中定义的UNIX的shell将会被用来执行<command string>,如果SHELL没有定义,那就使用UNIX的标准shell:/bin/sh。(在Windows中使用Command.com或 cmd.exe)

还有一个gdb命令是make:
    make <make-args>
    可以在gdb中执行make命令来重新build自己的程序。这个命令等价于“shell make <make-args>”。

//例如修改了tst.c程序,试用make tst,则直接对tst进行build.而无需自己再次进行gcc tst.c -o tst!!没有-g噢!


在GDB中运行程序
————————

当以gdb <program>方式启动gdb后,gdb会在PATH路径和当前目录中搜索<program>的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。

在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。

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


调试已运行的程序
————————

两种方法:
1、在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb <program> PID格式挂接正在运行的程序。
2、先用gdb <program>关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。

 

暂停 / 恢复程序运行
—————————

调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。

当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。

在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令。


一、设置断点(BreakPoint)
   
    我们用break命令来设置断点。正面有几点设置断点的方法:
   
    break <function>
        在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。

    break <linenum>
        在指定行号停住。

    break +offset
    break -offset
        在当前行号的前面或后面的offset行停住。offiset为自然数。

    break filename:linenum
        在源文件filename的linenum行处停住。

    break filename:function
        在源文件filename的function函数的入口处停住。

    break *address
        在程序运行的内存地址处停住。

    break
        break命令没有参数时,表示在下一条指令处停住。

    break ... if <condition>
        ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。

    查看断点时,可使用info命令,如下所示:(注:n表示断点号)
    info breakpoints [n]
    info break [n]
   

二、设置观察点(WatchPoint)
   
    观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
   
    watch <expr>
        为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
       
    rwatch <expr>
        当表达式(变量)expr被读时,停住程序。
       
    awatch <expr>
        当表达式(变量)的值被读或被写时,停住程序。
   
    info watchpoints
        列出当前所设置了的所有观察点。


三、设置捕捉点(CatchPoint)

    你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:
   
    catch <event>
        当event发生时,停住程序。event可以是下面的内容:
        1、throw 一个C++抛出的异常。(throw为关键字)
        2、catch 一个C++捕捉到的异常。(catch为关键字)
        3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
        4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
        5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
        6、load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
        7、unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)

    tcatch <event>
        只设置一次捕捉点,当程序停住以后,应点被自动删除。

转载于:https://www.cnblogs.com/Tinyshine/p/4423487.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下CMAKE编译jsoncpp,c – 如何为jsoncpp编写cmake模块?

我想使用jsoncpp编写C代码以解析JSON文件.让我解释一下我做了什么.我创建了一个CMakeLists.txt,我创建了一个FindJsoncpp.cmake以及一个简单的c文件来测试jsoncpp.当我使用-I /usr/include / jsoncpp / -ljsoncpp编译没有cmake的C源时,它工作正常.但是当我尝试使用cmake构建它时…

前端学习(1438):vue三种安装方式

1. 直接下载源码然后通过路径引入- 开发版本&#xff1a;https://vuejs.org/js/vue.js- 生产版本&#xff1a;https://vuejs.org/js/vue.min.js2. CDNjs <script src"https://cdn.jsdelivr.net/npm/vue2.5.16/dist/vue.js"></script> 3. 使用 npm 下载&…

三星s7共享网络给linux,三星Galaxy S7WiFi状态下可以共享wifi热点吗【详解】

目前&#xff0c;越来越多的智能手机都具有wifi热点的功能&#xff0c;不仅方便了不少网友之间的网络流量共享&#xff0c;而且一个wifi热点还可以共享到多个设备。而三星最新款手机三星Galaxy S7与S7 Edge在wifi热点功能的基础上&#xff0c;将wifi热点功能进行的升华&#xf…

文件处理封装

/// <summary>/// 文件处理封装/// </summary> public static class FileHelper{/// <summary>/// 读取Txt文件/// </summary>/// <param name"FilePath">文件地址</param>/// <returns>文件内容</returns>public s…

前端学习(1439):vue的helloworld

#### 2.2 HelloWorld> 作用:将数据应用在html页面中1. body中,设置Vue管理的视图<div id"app"></div>2. 引入vue.js3. 实例化Vue对象 new Vue();4. 设置Vue实例的选项:如el、data... new Vue({选项:值});5. 在<div idapp></div>中通过…

解决空值的策略

使用Option<T>类型二不是null是解决空值问题的另一种策略。与null相比&#xff0c;Option<T>类型是一个更安全的方法&#xff0c;因为它同样适用于值类型和引用类型。而且它的功能更强大&#xff0c;因为它用“元数据”的方法保存一个值的额外信息&#xff0c;因此…

linux c 内存分配内存,Linuxc - 操作系统内存分配

静态变量是存储在数据段的&#xff0c;在函数中可以共用。全局变量也是存储在数据段的&#xff0c;在全局中可以共用。指针变量本质上是地址&#xff0c;数组变量本质上也是地址。数组是可靠的&#xff0c;不可变的地址。指针变量是不可靠的&#xff0c;可变的。数组本质上是指…

管理linux中文件共享,Linux操作系统文件管理器的共享

在目前最流行的RedHatLinux 9.0中有GNOME和KDE这两个图形桌面。这两个桌面系统中分别有两个不同的文件管理器&#xff1a;在GNOME中是Nautilus(鹦鹉螺)而KDE中是Konqueror&#xff0c;各有不少很实用的特色。其实不管你登录哪个桌面都可以同时使用这两个文件管理器&#xff0c;…

mysql区分大小写搜索

form:http://www.uphtm.com/database/257.html 在默认情况下&#xff0c;MySQL搜索不区分大小写&#xff08;但某些字符集始终区分大小写&#xff0c;如czech&#xff09;。这意味着&#xff0c;如果你使用col_name LIKE a%进行搜索&#xff0c;你将获得以A或a开始的所有列。如…

dos安装深度linux,U盘用grub4dos引导Deepin v20 Beta iso安装的方法

下面为你带来U盘grub4dos引导和linux系统硬盘引导Deepin Linux镜像的方法&#xff0c;可适用在Deepin v20 Beta iso上&#xff0c;亲测可成功安装Deepin v20 Beta iso镜像到硬盘。下载Deepin v20 Beta iso请看&#xff1a;深度操作系统Deepin 20 Beta版本发布ISO下载。一、U盘引…

从内存中加载DLL Delphi版(转)

源&#xff1a;从内存中加载DLL DELPHI版 原文 &#xff1a; http://www.2ccc.com/article.asp?articleid5784 MemLibrary.pas //从内存中加载DLL DELPHI版 unit MemLibrary;interfaceuses Windows;function memLoadLibrary(pLib: Pointer): DWord; function memGetProcAddr…

linux 定时执行kettle6,linux下使用crond定时执行kettle的job

由于第一次碰linux&#xff0c;对其不是很了解&#xff0c;导致这个问题困扰了我近一个月的时间&#xff0c;现在终于解决了&#xff0c;分享给大家。首先&#xff0c;安装jre&#xff0c;配置java环境变量(一)下载jre-6u23-linux-x64.bin下载地址&#xff1a;http://cds-esd.s…

【leetcode】ZigZag Conversion

题目简述 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A H N A P L S I I G Y I R And then read line by line: "PA…

ld-linux.so.2 重定向,2-Linux重定向和管道、Shell编程.doc

2-Linux重定向和管道、Shell编程评 分实验报告课程名称&#xff1a; 操作系统实验名称&#xff1a; Red Hat Linux操作系统的运用专 业&#xff1a; 信息与计算科学成 员&#xff1a; 庄小俪指导教师&#xff1a; 陆星家完成日期&#xff1a; 2013 年 9月 24日实验二 Linux的重…

linux中文乱码

txt文件在linux环境下打开呈现了乱码状态。 解决方法1&#xff1a;在linux用iconv命令&#xff0c;如乱码文件名为zhongwen.txt&#xff0c;那么在终端输入如下命令&#xff1a; iconv -f gbk -t utf8 zhongwen.txt > zhongwen.txt.utf8 如果eclipse打开后仍是乱码&#xff…

c语言用for编程图形,C语言编程题求解

2009-05-13C语言简单的编程题求解1.从键盘输入一//将四个函数编成四个子函数了&#xff0c;在一个主函数里调用&#xff0c;你若需要&#xff0c;分别取出来用也可以。以下源代码&#xff0c;VS2005编译通过。//1。从键盘输入一行字符&#xff0c;分别统计其中字母字符和数字字…

2.3线性表的链式存储和运算—单链表应用举例

例2.5 已知单链表H&#xff0c;写一算法将其倒置。即实现如图2.22的操作。(a)为倒置前&#xff0c;(b)为倒置后。 算法思路&#xff1a;依次取原链表中的每个结点&#xff0c;将其作为第一个结点插入到新链表中去&#xff0c;指针p用来指向当前结点&#xff0c;p为空时结束。 算…

c语言see函数,vprintf() - C语言库函数

C库函数 int vprintf(const char *format, va_list arg) 发送格式化输出到stdout使用一个参数列表传递给它。声明以下是 vprintf() 函数的声明。intvprintf(constchar*format,va_list arg)参数format -- 这是包含文本的字符串被写入到缓冲。它可以包含嵌入的格式在随后的附加…

js获取checkbox值的方法

js获取checkbox值的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"> <title>js</title> </head> <script language&q…