GDB如何调试没有符号表(未加-g选项的编译)的程序

/*********************************************************************
 * 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

时间: 2024-11-08 18:37:27

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

VxWorks 符号表

符号表初始化          符号表用于建立符号名称.类型和值之间的关系.其中,名称为null结尾的任意字符串:类型为标识各种符号的整数:值为一个字符指针.符号表主要用来作为目标模块加载的基础,但在需要名称和值关联的任何时候都看使用.           运行系统中一般存在两个符号表结构sysSymTbl和statSymTbl.sysSymTbl为目标机的系统符号表,通过程序或tShell动态加载的目标模块的符号模块的符号都添加到该符号表中,sysSymTbl和statSymTbl两个标识本身

调试时,总出现"未加载符号"??怎么解决???急!!!!

问题描述 调试时,总出现"未加载符号"??怎么解决???自动附加到计算机"C06F070D8671420"上的进程"[340]aspnet_wp.exe"成功."DefaultDomain":已加载"c:windowsmicrosoft.netframeworkv1.1.4322mscorlib.dll",未加载符号."DefaultDomain":已加载"c:windowsassemblygac

GDB单步调试基础

最近全面换成 Linux 平台了,感觉如果不玩游戏 Linux 桌面基本可以替代 Windows 了,但是调试器这个还是问题,gdb可以解决这个问题. 一.GDB 概述 GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像 VC . BCB 等 IDE 的调试,但如果你是在 UNIX 平台下做软件,你会发现 GDB 这个调试工具有比 VC . BCB 的图形化调试器更强大的功能.所谓 " 寸有所长,尺有所短 " 就是这个道理

内核符号表的生成和查找过程【转】

转自:http://blog.csdn.net/jasonchen_gbd/article/details/44025681 权声明:本文为博主原创文章,转载请附上原博链接. 在内核中维护者一张符号表,记录了内核中所有的符号(函数.全局变量等)的地址以及名字,这个符号表被嵌入到内核镜像中,使得内核可以在运行过程中随时获得一个符号地址对应的符号名.而内核代码中可以通过 printk("%pS\n", addr) 打印符号名. 本文介绍内核符号表的生成和查找过程. 1. System.ma

linux内核符号表kallsyms简介

在使用perf排查问题时,我们经常会发现[kernel.kallsyms]这个模块.这到底是个什么东西呢? 简介: 在2.6版的内核中,为了更方便的调试内核代码,开发者考虑将内核代码中所有函数以及所有非栈变量的地址抽取出来,形成是一个简单的数据块(data blob:符号和地址对应),并将此链接进 vmlinux 中去. 在需要的时候,内核就可以将符号地址信息以及符号名称都显示出来,方便开发者对内核代码的调试.完成这一地址抽取+数据快组织封装功能的相关子系统就称之为 kallsyms. 反之,如

iOS符号表恢复&amp;逆向支付宝

推荐序 本文介绍了恢复符号表的技巧,并且利用该技巧实现了在 Xcode 中对目标程序下符号断点调试,该技巧可以显著地减少逆向分析时间.在文章的最后,作者以支付宝为例,展示出通过在 UIAlertView 的 show 方法处下断点,从而获得支付宝的调用栈的过程. 本文涉及的代码也开源在:https://github.com/tobefuturer/restore-symbol,欢迎 Star 和提 Issue.感谢作者授权发表. 作者介绍:杨君,中山大学计算机系研究生,iOS 开发者,擅长领域

使用 gdb 工具调试 Go

排除应用程序故障是比较复杂的,特别是处理像 Go 这样的高并发语言.它更容易在具体位置使用 print 打印语句来确定程序状态,但是这个方法很难根据条件发展去动态响应你的代码. 调试器提供了一个强大得令人难以置信的故障排除机制.添加排除故障的代码可以巧妙地影响到应用程序该如何运行.调试器可以给正在迷茫的你更精确的看法. 已经有许多 Go 的调试器存在了,其中一些调试器的不好之处是通过在编译时注入代码来提供一个交互终端.gdb 调试器则允许你调试已经编译好的二进制文件,只要他们已经与 debug

未加载webengine4 pdb-未加载webengine4.pdb 求大神指导

问题描述 未加载webengine4.pdb 求大神指导 调试的时候报这个:未加载webengine4.pdb 新手,请大神帮助.谢谢! 解决方案 pdb就是符号信息文件,你用到的这个webengine4库的符号文件你没有导入,编译器找不到,如果你不需要调试它webengine4的代码,没有也没关系 解决方案二: 安装.net framework 4 运行aspnet_regiis -i注册asp.net 删除你的bin obj目录的内容,重新编译

Android下用gdb远程调试办法

  Host: ubuntu Target: Android ICS 1. 将gdbserver和gdbclient分别放入target和host.两者都可在android源代码的prebuilt目录下找到. 2. 在Target上启动gdbserver,在adb shell中执行 $ /path/to/gdbserver :1111--attach PID 其中PID为想要debug程序的进程号,可以通过ps得到.1111为端口号,可以自定义. 3. 在Host上启动gdbclient,首先将