一。编译

gcc的完整编译过程大致为:预处理->编译->汇编->链接

前三个步骤分别对应了-E、-S、-c三个选项。

编译阶段 命令 截断后的产物
    C源程序
预处理 gcc -E 替换了宏的C源程序(没有了#define,#include…), 删除了注释
编译 gcc -S 汇编源程序
汇编 gcc -c 目标文件,二进制文件, 允许有不在此文件中的外部变量、函数
链接 gcc 可执行程序,一般由多个目标文件或库链接而成, 二进制文件,所有变量、函数都必须找得到

objdump是linux下一款反汇编工具,能够反汇编目标文件、可执行文件。

主要选项:

objdump -f
显示文件头信息 objdump -d
反汇编需要执行指令的那些section objdump -D
与-d类似,但反汇编中的所有section objdump -h
显示Section Header信息 objdump -x
显示全部Header信息 objdump -s
将所有段的内容以十六进制的方式打印出来
gcc -c -o main.o main.c objdump -s -d main.o > main.o.txt gcc -o main main.c objdump -s -d main > main.txt
因为 linux 下目标文件和可执行文件的内容格式是一样的, 所以 objdump 既可以反汇编可执行文件也可以反汇编目标文件。

$ g++ main.cpp -o xmain

$ ./xmain 

$ file xmain
xmain: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=86d2a0552a2e36ac27d4c233c9ddfd462e0e599d, not stripped

$nm xmain

0000000000601068 B __bss_start
0000000000601190 b completed.6973
0000000000601191 b _ZStL8__ioinit
U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4

$ strip xmain
$ nm xmain

: no symbols

在实际的开发中, 经常需要对动态库.so进行strip操作, 减少占地空间。 而在调试的时候(比如用addr2line), 就需要符号了。 因此, 通常的做法是: strip前的库用来调试, strip后的库用来实际发布, 他们两者有对应关系。 一旦发布的strip后的库出了问题, 就可以找对应的未strip的库来定位。

二。调试

$ gcc -g main.cpp -o xmain

 $ gdb xmain

(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 all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

查看编码:

(gdb) set target-charset

设置编码:

(gdb) set charset UTF-8

显示汇编

layout asm

显示汇编和源码

layout split

运行一个程序

(gdb) run
Starting program: /test/xmain

栈追踪

(gdb) backtrace
No stack.
(gdb) where
No stack.
(gdb) bt
No stack.

检查变量

(gdb) print $1
$2 = 0

(gdb) print array[1]
$4 = {data = 0x400a9a "neil", key = 4}

GDB将命令的结果保存在伪变量$<number>中,最后一次操作的结果总是$,倒数第二次的结果为$$

(gdb) print array[0]@5  //@<number> 打印number个数组元素
$5 = {{data = 0x400a95 "bill", key = 3}, {data = 0x400a9a "neil", key = 4}, {
data = 0x400a9f "john", key = 2}, {data = 0x400aa4 "rick", key = 5}, {
data = 0x400aa9 "alex", key = 1}}

列出程序源码

(gdb) list
37 {"rick", 5},
38 {"alex",1}
39 };

(gdb) cont
Continuing.

Breakpoint 1, BubbleSort (dat=0x601080 <array>, n=5) at main.cpp:21
21 item t = dat[j];

40
41
42 int main()
43 {
44 //int len = sizeof(array);
45 //cout << len << endl;
46 BubbleSort(array, 5);

会打印出围绕当前位置前后的一段代码,如果继续使用list,将显示更多的代码。

也可以给list提供一个行号或函数名作为参数

eg。

(gdb) list BubbleSort
6 const char *data;
7 int key;
8 }item;
9
10 void BubbleSort(item *dat, int n)
11 {
12 bool flag = true;
13 int i=0;
14 while(flag)
15 {

设置断点

(gdb) help breakpoint
Making program stop at certain points.

List of commands:

awatch -- Set a watchpoint for an expression
break -- Set breakpoint at specified line or function
break-range -- Set a breakpoint for an address range
catch -- Set catchpoints to catch events
catch assert -- Catch failed Ada assertions
catch catch -- Catch an exception
catch exception -- Catch Ada exceptions
catch exec -- Catch calls to exec
catch fork -- Catch calls to fork
catch load -- Catch loads of shared libraries
catch rethrow -- Catch an exception
catch signal -- Catch signals by their names and/or numbers
catch syscall -- Catch system calls by their names and/or numbers
catch throw -- Catch an exception
catch unload -- Catch unloads of shared libraries
catch vfork -- Catch calls to vfork
clear -- Clear breakpoint at specified line or function
commands -- Set commands to be executed when a breakpoint is hit
condition -- Specify breakpoint number N to break only if COND is true
---Type <return> to continue, or q <return> to quit---

(gdb) break 21
Breakpoint 1 at 0x400894: file main.cpp, line 21.
(gdb) run
Starting program:/xmain
warning: File "/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".

Breakpoint 1, BubbleSort (dat=0x601080 <array>, n=5) at main.cpp:21
21 item t = dat[j];

(gdb) cont
Continuing.

Breakpoint 1, BubbleSort (dat=0x601080 <array>, n=5) at main.cpp:21
21 item t = dat[j];

display在每次程序停在断点处时自动显示数组的内容

(gdb) display array[0]@5
1: array[0]@5 = {{data = 0x400a95 "bill", key = 3}, {data = 0x400a9f "john",
key = 2}, {data = 0x400a9a "neil", key = 4}, {data = 0x400aa4 "rick",
key = 5}, {data = 0x400aa9 "alex", key = 1}}

也可以修改断点设置,使程序不是在断点处停下来,而只是显示要查看的数据,然后继续执行。

(gdb) commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>cont
>end
//(gdb)
(gdb) cont
Continuing.

Breakpoint 1, BubbleSort (dat=0x601080 <array>, n=5) at main.cpp:21
21 item t = dat[j];
1: array[0]@5 = {{data = 0x400a9f "john", key = 2}, {data = 0x400a95 "bill",
key = 3}, {data = 0x400a9a "neil", key = 4}, {data = 0x400aa9 "alex",
key = 1}, {data = 0x400aa4 "rick", key = 5}}

Breakpoint 1, BubbleSort (dat=0x601080 <array>, n=5) at main.cpp:21
21 item t = dat[j];
1: array[0]@5 = {{data = 0x400a9f "john", key = 2}, {data = 0x400a95 "bill",
key = 3}, {data = 0x400aa9 "alex", key = 1}, {data = 0x400a9a "neil",
key = 4}, {data = 0x400aa4 "rick", key = 5}}

Breakpoint 1, BubbleSort (dat=0x601080 <array>, n=5) at main.cpp:21
21 item t = dat[j];
1: array[0]@5 = {{data = 0x400a9f "john", key = 2}, {data = 0x400aa9 "alex",
key = 1}, {data = 0x400a95 "bill", key = 3}, {data = 0x400a9a "neil",
key = 4}, {data = 0x400aa4 "rick", key = 5}}
1
2
3
4
5
[Inferior 1 (process 13323) exited normally]

用调试器打补丁

info显示设置的断点及displa

(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
1: y array[0]@5
(gdb) inf
inferior info
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400894 in BubbleSort(item*, int)
at main.cpp:21
breakpoint already hit 6 times
cont

(gdb) break 23
Breakpoint 2 at 0x4008ef: file main.cpp, line 23.
(gdb) commands 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>set variable n = n +1
>cont
>end
(gdb) run
Starting program:/xmain

Breakpoint 2, BubbleSort (dat=0x601080 <array>, n=5) at main.cpp:23
23 dat[j+1] = t;

Breakpoint 2, BubbleSort (dat=0x601080 <array>, n=6) at main.cpp:23
23 dat[j+1] = t;

Breakpoint 2, BubbleSort (dat=0x601080 <array>, n=7) at main.cpp:23
23 dat[j+1] = t;

Breakpoint 2, BubbleSort (dat=0x601080 <array>, n=8) at main.cpp:23
23 dat[j+1] = t;

Breakpoint 2, BubbleSort (dat=0x601080 <array>, n=9) at main.cpp:23
23 dat[j+1] = t;

Breakpoint 2, BubbleSort (dat=0x601080 <array>, n=10) at main.cpp:23
23 dat[j+1] = t;

Breakpoint 2, BubbleSort (dat=0x601080 <array>, n=11) at main.cpp:23
23 dat[j+1] = t;

lint:清理程序中的垃圾

splint:http://www.splint.org

断言

assert.h

void assert(int expression);

如果在处理某个头文件时已经定义了NDEBUG,就不定义assert宏。在编译期间使用-DNDEBUG关闭断言,或者把#define NDEBUG发到每个#include <assert.h>之前。

$ gcc -g main.cpp -lefence -o xmain

gdb调试1--包括反汇编及文件编码设置的更多相关文章

  1. Eclipse文件编码设置的问题

    Eclipse中设置编码的方式 如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出, 则最好使 Java文件使用UTF-8编码.然而,Eclipse工作空间(workspace)的缺 ...

  2. gdb 调试的信息输出到文件

    # (gdb) set logging file <文件名> # (gdb) set logging on # (gdb) thread apply all bt # (gdb) set ...

  3. (转)Eclipse - CDT使用GDB调试C++的问题-无源文件命名(No source file named)

    http://tech.ddvip.com/2014-09/1411618782213496.html Eclipse CDT调试C++, 使用的Unix的调试器GDB; 由于在Unix下, 文件的目 ...

  4. Eclipse2013_文件编码设置

    1. Eclipse --> Window --> Preferences --> General --> Workspace 其中的 "Text file enco ...

  5. WinMerge文件编码设置

    http://blog.sina.com.cn/s/blog_7575fab10101o0na.html 系统默认是System codepage,我们要选用Custom codepage.值得注意的 ...

  6. Eclipse中 *.properties 文件编码设置

    Eclipse 中的默认编码格式为 ISO-8895-1,在此编码下中文的会显示如下的效果 解决方法 Windows --> Preference --> General Types -- ...

  7. 修改VISUAL STUDIO EXPRESS 2012新建C++文件编码

    本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供markdown格式源码,欢迎使 ...

  8. 一文入门Linux下gdb调试(二)

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...

  9. 20145212——GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...

随机推荐

  1. C. Meme Problem

    链接 [http://codeforces.com/contest/1076/problem/C] 题意 a+b=d and a⋅b=d. 计算出a和b 分析 ab=a(d-a)=d aa-ad+d= ...

  2. 《Linux内核分析》第五周笔记 扒开系统调用的三层皮(下)

    扒开系统调用的三层皮(下) 一.给menuOS增加time和time-asm 通过内核调试系统调用.将上次做的实验加入到menusOS,变成menusOS里面的两个命令. 1 int Getpid(i ...

  3. 【实践报告】Linux实践二

    3.编译并安装内核与模块 sudo make bzImage –j3         编译内核 sudo make modules –j3         编译模块 sudo make modules ...

  4. 软件项目第一次Sprint总结

    成果评分表: 组名 分数 原因 9-652 6 界面和谐生动,可运行,在目前阶段可时间基本操作 hzsy -2 代码下载,但实现安卓和相机调用 JYJe族 -1 实现安卓界面,完成一项功能,做得少 结 ...

  5. shell脚本--数值比较

    用于数值比较的无非大于.小于.等于.大于等于.小于等于这几个. 比较格式: [ 数值1 比较符 数值2 ]   注意左边的括号与数值1之间有一个空格,同样,数值2和右边的括号之间也有空格. 数值比较运 ...

  6. Qt_颜色选择对话框(QColorDialog)

    转自豆子空间 使用QColorDialog也很简单,Qt提供了getColor()函数,类似于QFileDialog的getOpenFileName(),可以直接获得选择的颜色. include &l ...

  7. VS2008中英文转换

    设置Visual Studio的语言: 工具=>选项=>环境=>区域设置=>语言 如图: 对于英文不好的朋友还是挺好用的

  8. Lodop打印控件中PRINT_INITA()和PRINT_PAGESIZE()宽高

    Lodop中有两个初始化语句,PRINT_INIT()和PRINT_INITA(),PRINT_INITA()多了四个参数,前两个是整体偏移值,第三四参数是宽高,这个宽高是指打印设计可视化编辑区域的宽 ...

  9. codeforces710B

    Optimal Point on a Line CodeForces - 710B You are given n points on a line with their coordinates xi ...

  10. ThinkPHP 框架出现安全隐患 ,导致网站被持续攻击一周

    导读 据 ZDNET 报道,有超过 45000 个中国网站由于使用 ThinkPHP 框架受到了攻击. 这些攻击针对的是使用 ThinkPHP 构建的网站,ThinkPHP 是一个中国的 PHP 框架 ...