/*********************************************************************
 * Author  : Samson
 * Date    : 01/30/2015
 * Test platform:
 *              3.13.0-24-generic
 *              GNU bash, 4.3.11(1)-release 
 * *******************************************************************/
很多时候,发行版的程序在编译的时候都是没有加上-g这个选项的,那么若是想调试一个程序,应该怎么办呢?

在加了-g选项时,是可以通过行号、函数名等进行断点的设置的,但是没有符号表的情况下,那么怎么来进行程序的断点的设置并进行调试呢?

这就要用到反汇编然后再对地址进行断点的设置来进行调试,具体情况可参看以下例子的过程:

test.c代码如下:

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

int main()
{
    int m = 0, n =9;
    int k = m+n;
    printf("k is %d\n", k);
    m = k + n;
    printf("m is %d\n", m);
    n = m-n;
    printf("n is %d\n", n);
    return 0;
}
使用不带-g参数的编译命令行进行编译:

linuxidc@linuxidc:~$ gcc test.c
使用gdb进行程序的调试:

linuxidc@linuxidc:~$ gdb a.out 
GNU gdb (GDB) 7.5.91.20130417-cvs-Ubuntu
Copyright (C) 2013 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://www.gnu.org/software/gdb/bugs/>...
Reading symbols from a.out...(no debugging symbols found)...done.
(gdb) l
没有符号表被读取。请使用 "file" 命令。
(gdb) disassemble main 
Dump of assembler code for function main:
  0x0804841c <+0>:    push  %ebp
  0x0804841d <+1>:    mov    %esp,%ebp
  0x0804841f <+3>:    and    $0xfffffff0,%esp
  0x08048422 <+6>:    sub    $0x20,%esp
  0x08048425 <+9>:    movl  $0x0,0x14(%esp)
  0x0804842d <+17>:    movl  $0x9,0x18(%esp)
  0x08048435 <+25>:    mov    0x18(%esp),%eax
  0x08048439 <+29>:    mov    0x14(%esp),%edx
  0x0804843d <+33>:    add    %edx,%eax
  0x0804843f <+35>:    mov    %eax,0x1c(%esp)
  0x08048443 <+39>:    mov    0x1c(%esp),%eax
  0x08048447 <+43>:    mov    %eax,0x4(%esp)
  0x0804844b <+47>:    movl  $0x8048540,(%esp)
  0x08048452 <+54>:    call  0x80482f0 <printf@plt>
  0x08048457 <+59>:    mov    0x18(%esp),%eax
  0x0804845b <+63>:    mov    0x1c(%esp),%edx
  0x0804845f <+67>:    add    %edx,%eax
  0x08048461 <+69>:    mov    %eax,0x14(%esp)
  0x08048465 <+73>:    mov    0x14(%esp),%eax
  0x08048469 <+77>:    mov    %eax,0x4(%esp)
  0x0804846d <+81>:    movl  $0x8048549,(%esp)
  0x08048474 <+88>:    call  0x80482f0 <printf@plt>
  0x08048479 <+93>:    mov    0x18(%esp),%eax
  0x0804847d <+97>:    mov    0x14(%esp),%edx
  0x08048481 <+101>:    mov    %edx,%ecx
  0x08048483 <+103>:    sub    %eax,%ecx
  0x08048485 <+105>:    mov    %ecx,%eax
  0x08048487 <+107>:    mov    %eax,0x18(%esp)
  0x0804848b <+111>:    mov    0x18(%esp),%eax
  0x0804848f <+115>:    mov    %eax,0x4(%esp)
  0x08048493 <+119>:    movl  $0x8048552,(%esp)
  0x0804849a <+126>:    call  0x80482f0 <printf@plt>
  0x0804849f <+131>:    mov    $0x0,%eax
  0x080484a4 <+136>:    leave  
  0x080484a5 <+137>:    ret    
End of assembler dump.
(gdb) b *0x08048452
Breakpoint 1 at 0x8048452
(gdb) b *0x08048474
Breakpoint 2 at 0x8048474
(gdb) b *0x0804849a
Breakpoint 3 at 0x804849a
(gdb) info b
Num    Type          Disp Enb Address    What
1      breakpoint    keep y  0x08048452 <main+54>
2      breakpoint    keep y  0x08048474 <main+88>
3      breakpoint    keep y  0x0804849a <main+126>
(gdb) r
Starting program: a.out

Breakpoint 1, 0x08048452 in main ()
(gdb) c
Continuing.
k is 9

Breakpoint 2, 0x08048474 in main ()
(gdb) c
Continuing.
m is 18

Breakpoint 3, 0x0804849a in main ()
(gdb) c
Continuing.
n is 9
[Inferior 1 (process 19933) exited normally]

由以上的步骤可以看出,使用了disassemble main 进行主函数的反汇编,然后使用了b *address进行三处printf的地址的断点的设置。

GDB调试程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

GDB+GDBserver无源码调试Android 动态链接库的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

使用hello-gl2建立ndk-GDB环境(有源码和无源码调试环境) http://www.linuxidc.com/Linux/2013-06/85935.htm

在Ubuntu上用GDB调试printf源码 http://www.linuxidc.com/Linux/2013-03/80346.htm

Linux下用GDB调试可加载模块 http://www.linuxidc.com/Linux/2013-01/77969.htm

Ubuntu下使用GDB断点Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

使用GDB命令行调试器调试C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm

GDB 的详细介绍请点这里
GDB 的下载地址请点这里

本文永久更新链接地址http://www.linuxidc.com/Linux/2015-02/113324.htm

GDB如何调试没有符号表(未加-g选项的编译)的程序的更多相关文章

  1. 使用GDB调试将符号表与程序分离后的可执行文件

    环境: Centos7.3.GCC4.8.5 适用场景: 由于调试信息比较大,通常将程序分离为可执行程序和符号信息文件,只对外发布可执行程序,需要调试时再将符号信息文件附加. 一.创建可执行程序: u ...

  2. ELF格式文件符号表全解析及readelf命令使用方法

    http://blog.csdn.net/edonlii/article/details/8779075 1. 读取ELF文件头: $ readelf -h signELF Header:  Magi ...

  3. C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)

    详解link  有 些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错 ...

  4. (转载) C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)

    转载http://blog.csdn.net/neo_ustc/article/details/9024839 有 些人写C/C++(以下假定为C++)程序,对unresolved external ...

  5. 【转】gdb的调试与使用

    转载自:https://www.jianshu.com/p/7a06b0bda2d8 gdb的调试与使用 这篇应该是我见过的总结最详细的gdb调试指南了,这位博主是个很强的人,他的博客对萌新比较友好, ...

  6. 程序减肥,strip,eu-strip 及其符号表

    程序减肥,strip,eu-strip 及其符号表 我们要给我们生成的可执行文件和DSO瘦身,因为这样可以节省更多的磁盘空间,所以我们移除了debug信息,移除了符号表信息,同时我们还希望万一出事了, ...

  7. VxWorks 符号表

    符号表初始化           符号表用于建立符号名称.类型和值之间的关系.其中,名称为null结尾的任意字符串:类型为标识各种符号的整数:值为一个字符指针.符号表主要用来作为目标模块加载的基础,但 ...

  8. 转: iOS崩溃堆栈符号表使用与用途

    转:http://bugly.qq.com/blog/?p=119 iOS崩溃堆栈符号化,定位问题分分钟搞定! 2015.3.16 腾讯Bugly 微信分享   最近一段时间,在跟开发者沟通过程中,萝 ...

  9. WinDbg Preview安装以及符号表配置

    1.安装WinDbgPreview 在Microsoft Store直接搜索windbg就可以下载. 2.配置符号服务器 2.1 符号 符号是方便调试程序的文件,通常是pdb文件.一个模块(可执行程序 ...

随机推荐

  1. Fragment-Transaction 源码分析

    概述 这篇文章的简要分析了Activity中的Transaction和add,replace等操作以及backstack的工作原理. 分析transaction源码的原因是因为我在写一个测试代码的时候 ...

  2. SpringMVC-@RequestMapping的参数和用法

    RequestMapping里面的注解包含的参数如图: RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. ...

  3. 欧拉回路&欧拉路径学习笔记

    基础性质(用来判定): 1.无向图欧拉回路没有奇数点 (有向图所有点入度等于出度) 2.无向图欧拉路径只有两个奇数点 (有向图有一个顶点入度比出度大1,有一个顶点出度比入度大1,其他的全相等) 3.图 ...

  4. ssm 框架学习-1

    理论理解 +项目阅读 SpringSpring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象.Spring的核心思想是IoC(控制反转),即 ...

  5. 构建自己的AngularJS - 作用域和Digest(一)

    作用域 第一章 作用域和Digest(一) Angular作用域是简单javascript对象,因此你能够像对其它对象一样加入属性.然而,他们也有一些额外的功能:用于观測数据结构的变化.这样的观察能力 ...

  6. actionBar-进入界面闪烁问题解决

    问题分析: 主要是因为在开启一个应用的时候,当前界面并不是第一界面,在它之前,还有一个界面启动了,这个界面的唯一目的就是启动主界面,它目的不是显示.虽然如此,但是呢,这个界面的theme因为没有做统一 ...

  7. 新技能 get —— 如何校验 md5(windows)

    我们在某资源网站上下载完成指定文件后,尤其是一些下载所需较高时长的大型文件,如何检验下载的文件是否完好,也即如何保证和原始网站上的资源一样.此时就要用到检验码的机制,一般文件的下载界面,通常都会给出此 ...

  8. linux设置tab键的宽度为4

    先cd 到~目录 ~$ cd ~$ vi .vimrc set nu

  9. 过滤选择器及jQuery提供的相关方法

    基本过滤器: <body> <ul> <li>列表1</li> <li class="red">列表2</li&g ...

  10. Linux与好莱坞电影

    Linux与好莱坞电影         2009年底上映的<阿凡达>是电影特效的巅峰之作,除此之外还有<2012>每次观看之后总能让我们热血沸腾.      很早以前电影特效都 ...