/*********************************************************************
 * 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. Resource Access Based on Multiple Credentials

    A collection of multiple user credentials each associated with one of multiple different users is ob ...

  2. 洛谷——P2678 跳石头

    https://www.luogu.org/problem/show?pid=2678#sub 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着 ...

  3. 信号 signal sigaction补充

    目前linux中的signal()是通过sigation()函数实现的. 由signal()安装的实时信号支持排队,同样不会丢失. 先看signal 和 sigaction 的区别: 关键是 stru ...

  4. 没有killall命令的解决方法

    没有killall命令的解决方法 -bash: killall: command not found https://www.byte128.com/archives/231.html 执行killa ...

  5. js插件---放大镜如何使用

    js插件---放大镜如何使用 一.总结 一句话总结:一张高清图片被用了两次,一次做缩略图,一次做放大后显示用的的图片(其实这个图片就是高清图片本身,而且是部分) 14 <figure class ...

  6. Zabbix主动代理模式 + 主动模式agent客户端

    2.1.1 安装软件 ]# rpm -qa zabbix* zabbix-proxy-sqlite3-3.4.15-1.el7.x86_64 zabbix-proxy-mysql-3.4.15-1.e ...

  7. 深入了解Linux远程桌面

    本文转载于:http://www.linux521.com/2009/system/201004/11001.html 已发表在<网管员世界>2010年3月杂志             本 ...

  8. 如何优雅的写UI——(1)MFC六大核心机制-程序初始化

    很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下 ...

  9. 【Expression 序列化】WCF的简单使用及其Expression Lambada的序列化问题初步解决方案

    地址:http://www.cnblogs.com/guomingfeng/tag/Expression%E5%BA%8F%E5%88%97%E5%8C%96/

  10. 86.八千万qq密码按相似度排序并统计密码出现次数,生成密码库

    存储qq的文件地址以及按照密码相似度排序的文件地址 //存储qq的文件的地址 ] = "QQ.txt"; //按照密码相似度排序的文件地址 ] = "QQpassword ...