命令历史

命令历史

file

用于辨识文件类型

file [-bcLvz][-f <名称文件>][-m <魔法数字文件>...][文件或目录...]
-b:列出辨识结果,不显示文件名称
-c  详细显示指令执行过程,便于排错或分析程序执行的情形。
-f<名称文件>  指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。
-L  直接显示符号连接所指向的文件的类别。
-m<魔法数字文件>  指定魔法数字文件。
-v  显示版本信息。
-z  尝试去解读压缩文件的内容。
[文件或目录...] 要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

实例

[root@localhost ~]# file install.log
install.log: UTF-8 Unicode text

[root@localhost ~]# file -b install.log      <== 不显示文件名称
UTF-8 Unicode text

[root@localhost ~]# file -i install.log      <== 显示MIME类别。
install.log: text/plain; charset=utf-8

[root@localhost ~]# file -b -i install.log
text/plain; charset=utf-8

vi选项

vi命令并不锁住所编辑的文件,因此多个用户可能在同时编辑一个文件,那最后的文件版本将被保留。
-c sub-commmand在对指定的文件编辑前,先执行指定的命令sub-command.
-r filename:恢复指定的文件filename
-R:将指定的文件以只读的方式放入编辑器中,这样不会保存对文件的任何修改。
-y number 将编辑窗口的大小设为number行。

自命令模式

h 将光标左移一格。
l 将光标右移一格。
j 将光标下移一格。
k 将光标上移一格。
w 将光标移到下一个小字的前面。
W 将光标移到下一个大字的前面。
b 将光标移到前一个小字的前面。
B 将光标移到前一个大字的前面。
e 将光标移到下一个小字的后面。
E 将光标移到前一个大字的后面。
fc:把光标移到同一行的下一个c字符处。
Fc:把光标移到同一行的前一个c字符处。
tc:把光标移动同一行的下一个字符c的前一格。
Tc:把光标移到同一行的前一个字符c的前一格。
number|把关标移动递number列上。
行间移动
+或Enter 把光标移至下一行第一个非空白字符。
- 把光标移至上一行第一个非空白字符。
0 把光标移到当前行的第一个字符处。
$ 把光标移到当前行的最后一个字符处。
H 把光标移到屏幕最顶端一行。
L 把光标移到屏幕最底端一行。
M 把光标移到屏幕中间。
下面是命令模式下改变屏幕显示的子命令:
z- 把当前行作为屏幕的最后一行,并重新显示屏幕。
z. 把当前行作为屏幕的中间一行,并重新显示屏幕。
Ctrl+l 重新显示屏幕当前内容。
显示页面
/pattern/z- 寻找pattern的下一个位置,并把所在行设为屏幕的最后一行。

  下面是在命令模式下用来显示页面的子命令:
Ctrl + f向后滚一页。
Ctrl + d向后滚半页。
Ctrl + b向前滚一页。
Ctrl + u向前滚半页。
Ctrl + e屏幕向下滚一行。
Ctrl + y屏幕项上滚一行。
查找字符串
  下面是在命令模式下用来查找字符串所使用的子命令:
/pattern 向后寻找指定的pattern ,若遇到文件尾,则从头再开始。
?pattern 向前寻找指定的pattern ,若遇到文件头,则从尾再开始。
n 在上次指定的方向上,再次执行上次定义的查找。
N 在上次指定的方向的相反方向上,再次执行上次定义的查找。
/pattern/+number 将光标停在包含pattern的行后面第number行上。
/pattern/-number 将光标停在包含pattern的行前面第number行上。
% 移到匹配的“()”或“{}”上。

  下面是在文本输入模式下用来输入文本的子命令(用户可在任何时候按Escape返回到命令模式):
a 在光标之后开始输入文本。
A在行尾开始输入文本。
i在光标之前开始输入文本。
I在行首第一个非空白字符前输入文本。
o在光标所在行后插入一空行。
O在光标所在行前插入一空行。
下面是在命令模式下改变文本所使用的子命令(用户可在任何的时候按Escape键返回到命令模式):
cc或S 修改一整行。
C 改变一行光标位置以后的部分。
cw 改变光标所在单词。
dd删除当前行。
D 删除光标所在行光标后面的内容。
dw删除光标所在的单词。
J 把下一行内容加到本行行尾。
rc把光符所在字符替换成c .
R 覆盖本行内容。
u恢复上一次的修改。
x删除光标所在的字符。
~ 改变光标所在出字符的大小写。
. 重复上一个操作。
<<把当前行移到左边。
>>把当前行移到右边。
  下面是用于文件中拷贝文本的字命令:
p 将缓冲区内容取到光标所在行的下面一行。
P 将缓冲区内容取到光标所在行的上面一行。
“bd 将文本删除至有名缓冲区b .
“bp 张贴有名缓冲区b中内容。
yy把当前行放入缓冲区。
Y 把当前行放入缓冲区。
Yw把光标所在的单词放入缓冲区。
  下面是用于保存文件的子命令:
:w 回写修改后的文件。
:w filename 当filename不存在时,把修改后的文件存为文件filename ,当文件filename存在时,报错。
!w filename 如果文件filename存在时,把修改后的文件保存为文件filename .

  下面列出了在vi编辑的多个文件之间切换所用的子命令:
:n开始编辑vi激活的文件列表中的下一个文件。
:n filenames 指定将被编辑的新的文件列表。

  下面列出了用于在当前文件和另外一个文件间切换的子命令:
:e filename 使用filename激活vi (在vi中装入另一个文件filename)。
e!重新装入当前文件,若当前文件有改动,则丢弃以前的改动。
:e+filename 使用filename激活vi ,并从文件尾部开始编辑。
:e+number filename 使用filename激活vi ,并在第number行开始编辑。
:e# 开始编辑另外一个文件。

 下面是在本文件中加入其他文件代码所使用的子命令:
:r filename读取filename文件,并将其内容加到当前文件后。
:r ! command执行command文件,并将其输出加到当前文件后。

  下面是vi中其他的子命令:
ctrl+g 取得正在编辑文件的有关信息。
:sh启动sh ,从sh中返回可用exit或ctrl+d .
:! Command 执行命令command .
!!重新执行上次的:! Command子命令。
:q退出vi ,若用户对编辑的文件有所修改,系统不会让用户使用q命令退出。
:q!退出vi而不管是否对文件有改动。
ZZ或:wq 保存对文件的修改并退出vi .
用户可在一个特殊的文件.exrc中定义特殊的vi命令。在vi中使用这些命令时,必须在该命令前加上一个冒号( :) 。

更改注释颜色


gdb

info registers
info all-registers

(下面这两个暂时不知道如何使用)
info registers reggroup …
info registers regname …

four standard register name:pc sp fp ps
p/x $pc
x/i $pc
set $sp += 4
————————————————
版权声明:本文为CSDN博主「彼岸攻猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaozi0221/article/details/90512542
2、GDB调试基本命令
(gdb) start : 运行程序
(gdb) continue : 从断点位置继续运行
(gdb) r(un) : 运行准备调试的程序,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和shell通配符(*、?、[、])在内。
(gdb) n(ext) : 单步运行,逐过程调试,C Style
(gdb) s(tep) : 单步运行,逐语句调试,C Style
(gdb) n(ext)i : 单步运行,逐过程调试, asm Style
(gdb) s(tep)i : 单步运行,逐语句调试, asm Style
finish : 如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish
until : 结束当前循环
whatis : 显示变量或函数类型
quit : 退出gdb
————————————————
版权声明:本文为CSDN博主「彼岸攻猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaozi0221/article/details/90512542

3.布局和显示数据

display /i $pc :命令可以在调试时显示每条汇编命令。
info win :显示窗口的大小
layout next :切换到下一个布局模式
layout prev :切换到上一个布局模式
layout src :只显示源代码,退出方法为Ctrl+X+A
layout asm :只显示汇编代码
layout split :显示源代码和汇编代码
layout regs :增加寄存器内容显示
focus cmd/src/asm/regs/next/prev :切换当前窗口
refresh /Ctrl+L :刷新所有窗口
tui reg next :显示下一组寄存器
tui reg system :显示系统寄存器
update :更新源代码窗口和当前执行点
print bb:打印变量
print $bb:打印寄存器
print test(22):将以整数22作为参数调用test()函数
display 表达式:在单步运行时非常有用,
watch 表达式:设置一个监视点,一旦被监视的”表达式“的值改变,gdb将强行终止正在调试的程序,如watch a
//查看源代码
list(l) :查看当前代码附近的代码行
list :简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。
list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
list 函数名:将显示“函数名”所在函数的源代码,如:list main
list :不带参数,将接着上一次 list 命令
4、查看运行信息
where/bt:当前运行的堆栈列表
bt/backtrace/info stack:显示当前调用堆栈
bt full:查看完整的调用堆栈的信息,包括每个栈帧中所有变量和参数的信息。
set args:指定运行时的参数。
show args:查看设置好的参数
info program:查看程序的是否在运行,进程号,被暂停的原因
5、设置断点和清除断点
break :在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
break :在指定行号停住。
break +offset / break -offset :在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum :在源文件filename的linenum行处停住。
break filename:function :在源文件filename的function函数的入口处停住。
break *address :在程序运行的内存地址处停住。
break :break命令没有参数时,表示在下一条指令处停住。
break … if < condition > …可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环体中,可以设置break if i==100,表示当i为100时停住程序。
b fn1 if a>b :条件断点设置
info break [n] :显示当前gdb的断点信息
delete [n] :清除指定断点
disable breakpoint [n] :禁止指定断点
enable breakpoint [n] :允许指定断点
以十进制的方式查看寄存器的值
p/d $pc
gdb调试时查看内存
x/<n/f/u> <addr>
1) n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容
2) f 表示显示的格式

3) u 表示将多少个字节作为一个值取出来,如果不指定的话,GDB默认是4个bytes,如果不指定的话,默认是4个bytes。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
参数 f 的可选值:

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

参数 u 可以用下面的字符来代替:

b 表示单字节

h 表示双字节

w 表示四字 节

g 表示八字节

当进入过程中汇编第二行时

%ebp和%esp指向的内存中的值是相同的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-urVMwSq6-1617888420864)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615537429550.png)]

当过程调用完成后,两个指针的值还原

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O1Y482Fu-1617888420866)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615537896449.png)]

常规调试过程总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NZI1m7a8-1617888420868)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615538954989.png)]

多进程,多线程参考面试笔记
gdb ./a.out
start 过渡到main函数入口
跟踪栈帧寄存器中的值
display /i $ebp为帧
display /i $esp为栈
查看代码和汇编指令布局模式
layout split

查看当前程序计数器指令地址,并取出值与汇编序列比较
p $pc
然后在查看汇编序列(小端法)
objdump -d a.out

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZckDvpnG-1617888420870)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615540525132.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mJy8myug-1617888420871)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615540771476.png)]

以上两张图发现机器指令以小端模式存储字节序列。

readelf

一般用于查看elf格式的文件信息,常见的文件如在Linux 上的可执行文件,动态库(.so)或者静态库(.a)

-h(elf header),显示文件开始的文件头信息,
-l(program header),segments显示程序头(段头)信息(如果有数据的话),

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FdHkXyBf-1617888420873)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615541534337.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6N58eIve-1617888420873)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615541691302.png)]

-S(section headers),sections显示节头信息(如果有数据的话)
-g(section groups),显示节组信息
-t,section-details显示节的详细信息。
-s,symbols显示符号表段中的项

-e,headers显示全部头信息,等价于-h -l -S
-n,notes显示note段(内核注释)的信息。
-r,relocs显示可重定位段的信息。
-u,unwind,显示unwind段信息,当前只支持A64 ELF的unwind段信息。
-d,dynamic显示动态段的信息。
-A,arch-specific显示CPU架构信息
-I,histogram显示符号的时候,显示bucket list长度的柱状图
-x,hex-dump=<number or name>以16进制方式显示指定段内内容,number指定段表中段的索引,或字符串指定文件中的段名。
-D,use-dynamic,使用动态段中的符号表显示符号,而不是使用符号段。
-a,all显示全部信息,等价于-h -l -S -s -r -d -V -A -l


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6rly4T4k-1617888420874)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615545477452.png)]

参数解释

Class:该文件的类型,这里是64位的elf格式
Data:该参数指明了文件中的组织方式是大端规则还是小端规则,此处位二进制存储的小端规则
OS/ANI:生成该文件的操作系统类型ABI(application Binary interface)
Type:当前文件的类型,EXEC(可执行文件),REL(可重定位文件),DYN(可被共享文件)
Machine:处理器类型
Entry point address:程序的虚拟地址入口点,可执行文件之外的类型改值为0x0
Start of program headers:程序头的开始处,从程序入口地址偏移地址开始,程序头table中记录elf文件中段的信息
Start of section headers:段头的开始处,从程序入口地址片地址开始
readelf -s

查看当前elf文件的符号表,符号表中的信息只包括全局变量和函数名。

动态符号表(.synsym)用来保存与动态链接相关的导入导出符号,不包括模块内的符号,而syn.tab保存所有的符号,包括dynsym中的符号。

目标文件的解析

目标文件指示elf文件的可重定位文件(Relocatable file)elf文件一共有4中类型,

Relocatable file、Executable file、Shared object fileCore Dump file

使用工具readelf和objdump对目标文件simple.o进行文件分析

elf结构

efl文件结构定义在**/usr/include/elf.h**中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1gBmwgks-1617888420874)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615547056479.png)]

typedef struct
{
  unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
  Elf64_Half    e_type;         /* Object file type */
  Elf64_Half    e_machine;      /* Architecture */
  Elf64_Word    e_version;      /* Object file version */
  Elf64_Addr    e_entry;        /* Entry point virtual address */
  Elf64_Off e_phoff;        /* Program header table file offset */
  Elf64_Off e_shoff;        /* Section header table file offset */
  Elf64_Word    e_flags;        /* Processor-specific flags */
  Elf64_Half    e_ehsize;       /* ELF header size in bytes */
  Elf64_Half    e_phentsize;        /* Program header table entry size */
  Elf64_Half    e_phnum;        /* Program header table entry count */
  Elf64_Half    e_shentsize;        /* Section header table entry size */
  Elf64_Half    e_shnum;        /* Section header table entry count */
  Elf64_Half    e_shstrndx;     /* Section header string table index */
} Elf64_Ehdr;

header中主要存放的是一些基本信息,通过header中的信息,我们可以确定后面其他字段的大小和起始地址,通过比较关心的部分是elf文件类型,是32bit还是64bit,header部分大小、section部分大小和同游section的个数等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1FX9UcTB-1617888420875)(https://upload-images.jianshu.io/upload_images/2118438-898da95915de8d2f.png?imageMogr2/auto-orient/strip|imageView2/2/w/922/format/webp)]

section部分
typedef struct
{
  Elf64_Word  sh_name;    /* Section name (string tbl index) */
  Elf64_Word  sh_type;    /* Section type */
  Elf64_Xword sh_flags;   /* Section flags */
  Elf64_Addr  sh_addr;    /* Section virtual addr at execution */
  Elf64_Off sh_offset;    /* Section file offset */
  Elf64_Xword sh_size;    /* Section size in bytes */
  Elf64_Word  sh_link;    /* Link to another section */
  Elf64_Word  sh_info;    /* Additional section information */
  Elf64_Xword sh_addralign;   /* Section alignment */
  Elf64_Xword sh_entsize;   /* Entry size if section holds table */
} Elf64_Shdr;

section部分主要存放的是机器指令代码和数据,执行命令readelf -S -W simple.o对Section部分的解析,解析结果和elf64_Shdr也是一一对应的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KTlR9qr3-1617888420876)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615547670166.png)]

对于这部分内容,通常我们比较的section是.text(存放代码)、.data(存放全局静态变量和局部静态变量)和.bss(存未初始化的全局变量和局部静态变量),

根据输出结果算出整个目标文件的组成部分和起始地址

使用ls -l 命令查看simple.o的大小,和simple.o结束地址0x0000048c是吻合的

img

解析一个目标文件
查看目标文件的section
objdump -h simple.o对section部分进行解析
得到每个段的大小

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-60iMS8oF-1617888420877)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615548716212.png)]

代码存放到.text中,已初始化全局变量和局部静态变量存放在data中,未初始化全局变量和局部静态变量存放在.bss中

img

代码段
objdump -s -d simple.o对代码段(.text)的解析结果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5YRzeXQs-1617888420878)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615549169677.png)]

格式化十六进制,两位一个字节:则代码段一共59个字节

55对应第一条指令

c3对应第一条指令

数据段和只读数据段
objdump -s -d simple.o

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-932fqBaA-1617888420879)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615549467897.png)]

bss段
执行命令objdump -x -s -d simple.o打印处目标文件的符号表,通过符号表可以直到各个变量的存放位置,只有未初始化的局部静态变量static_var2被放到了bss段,而global_uninit_var被放入了comment段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VZntO4HI-1617888420880)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615550056502.png)]

另外被初始化为0的静态变量也会被放入.bss段,因为未初始化变量的值也是0,经过优化后放入.bss段,这样可以节省磁盘空间,因为.bss不占磁盘空间。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yMQraRTP-1617888420880)(C:\Users\11066\AppData\Roaming\Typora\typora-user-images\1615550253804.png)]

zeXQs-1617888420878)]

格式化十六进制,两位一个字节:则代码段一共59个字节

55对应第一条指令

c3对应第一条指令

数据段和只读数据段
objdump -s -d simple.o

[外链图片转存中…(img-932fqBaA-1617888420879)]

bss段
执行命令objdump -x -s -d simple.o打印处目标文件的符号表,通过符号表可以直到各个变量的存放位置,只有未初始化的局部静态变量static_var2被放到了bss段,而global_uninit_var被放入了comment段

[外链图片转存中…(img-VZntO4HI-1617888420880)]

另外被初始化为0的静态变量也会被放入.bss段,因为未初始化变量的值也是0,经过优化后放入.bss段,这样可以节省磁盘空间,因为.bss不占磁盘空间。

[外链图片转存中…(img-yMQraRTP-1617888420880)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值