/*********************************************************************
 * 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. 秀秀SolarWinds为网络工程师准备的工具

    SolarWinds Engineer's Toolset部分功能截图 650) this.width=650;" onclick='window.open("http://blo ...

  2. mysql存储emoji表情报错处理,qq互联mysql存储昵称中带表情的数据时报错。

    前言 做qq互联登录时发现一个问题,如果qq昵称中有表情时存入mysql数据库会报错. java.sql.SQLException: Incorrect string value: "ð&q ...

  3. 今日SGU 5.12

    SGU 149 题意:求每一个点的距离最远距离的点的长度 收获:次大值和最大值,dfs #include<bits/stdc++.h> #define de(x) cout<< ...

  4. 【Mysql】将Excel表导入至Mysql的当中一张表

    如果表格有A(整型字段).B(整型字段).C(字符串数据)三列数据,希望导入到Mysql中数据库中表格table.table中须要插入的字段各自是col1,col2,col3 1.在随意一列,如果在D ...

  5. STL_算法_查找算法(search、find_end)

    C++ Primer 学习中. .. 简单记录下我的学习过程 (代码为主) search          //从左往右找第一个符合条件的子区间    全部容器适用 find_end  //从右往左找 ...

  6. 怎样在nat方式的虚拟机下做ssh连接

    很多人在本机做測试都是用桥接的方式让虚拟机上网. 假设ip地址紧张或者根本就不同意我们拥有一个局域网的ip.这时候便能够使用NAT方式+putty来远程操作. 第一步,打开设备-Network-更改网 ...

  7. CF1009F Dominant Indices(树上DSU/长链剖分)

    题目大意: 就是给你一棵以1为根的树,询问每一个节点的子树内节点数最多的深度(相对于这个子树根而言)若有多解,输出最小的. 解题思路: 这道题用树链剖分,两种思路: 1.树上DSU 首先想一下最暴力的 ...

  8. UML类图与类图中的关系

    以下内容摘自<Java与模式> 在类与类之间,会有连线指明它们之间的关系.类和类.类和接口.接口和接口之间可以建立以下几种关系:一般化关系.关联关系.聚合关系.合成关系和依赖关系,这几种关 ...

  9. Spring异步执行(@Async)2点注意事项

    Spring中可以异步执行代码,注解方式是使用@Async注解. 原理.怎么使用,就不说了. 写2点自己遇到过的问题. 1.方法是公有的 // 通知归属人 @Async public void not ...

  10. map按value查找相应元素

    find_if算法用来在map中查找value符合条件的pair元素,返回指向该符合条件元素的迭代器,如果找到,那么返回最后一个元素的后一个元素end(); 1.首先要定义头文件 #include & ...