黑道特种兵,人渣的本愿-金博宝 188bet_金博宝体育app_188宝金博下载

作者 | 守望
责编 | 郭芮

Linux常用指令中有一些指令能够在开发或调试过程中起到很好的协助效果,有些能够协助了解或优化咱们的程序,有些能够帮咱们定位疑难问题。

本文将简略介绍一下这些指令。


示例程序


咱们用一个小程序,来协助后边咱们对这些指令的描绘,程序清单cmdTest.c如下:

#include<stdio.h>
int test(int a,int b)
{
    return a/b;
}
int main(int argc,char *argv[])
{
    int a = 10;
    int b = 0;
    printf("a=%d,b=%d\n",a,b);
    test(a,b);
    return 0;
}

编译取得elf文件cmdTest并运转:

gcc -g -o cmdTest cmdT黑道特种兵,人渣的本愿-金博宝 188bet_金博宝体育app_188宝金博下载est.c
./cmdTest
a=10,b=0
Floating point exception (core dumped)

程序内容是在main函数中调用test,核算a/b的值,其间b的值为0,因而程序因为除0过错反常停止。


检查文件根本信息——file


file cmdTest
cmdTest: ELF 64-bit&nb复方对乙酰氨基酚片sp;LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=448e1c34b4c548120e2c04f6a2bfce4e6d2281a3, not stripped

经过file指令能够看到cmdTest的类型为elf,是64位、运转于x86-64的程序,not striped标明elf文件中还保留着符号信息以及调试信息等不影响程序运转的内容。


检查程序依靠库——ldd


ldd cmdTest
       linux-vdso.so.1 =>  (0x00007ffc8e548000)
       libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0621931000)
       /lib64/ld-linux-x86-64.so.2 (0x00007f0621cf6000)

咱们能够看到cmdTest依靠了libc.so等库。


检查函数或许全局变量是否存在于elf文件中——nm


nm指令用于检查elf文件的符号信息。文件编译出来之后,咱们或许不知道新添加的函数或许全局变量是否现已成功编译进去。这时候,咱们能够运用nm指令来检查。

例如,检查前面所说到的elf文件有没有test函数,能够用指令:

nm cmdTest|grep test
000000000040052d T test  #打印成果


依照地址次序列出符号信息:

nm -n cmdTest
                 w&黑道特种兵,人渣的本愿-金博宝 188bet_金博宝体育app_188宝金博下载nbsp;_ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w _Jv_RegisterClasses
                 w __gmon_start__
                 U __libc_start_main@@GLIBC_2.2.5
      &nbs南京禄口机场p;          U printf@@GLIBC_2.2.5
00000000004003e0 T _init
0000000000400440 T _start
0000000000400470 t deregister_tm_clones
00000000004004a0 t register_tm_clones
00000000004004e0 t __do_global_dtors_aux
0000000000400500 t frame_dummy
000000000040052d T test
0000000000400540 T main
0000000000400590 T __libc_csu_init
0000000000400600 T __libc_csu_fini
(列出部分内容)

能够看到test函数的开端地址为0x000000000040052d,完毕地址为0x0000000000400540。


打印elf文件中的可打印字符串——strings


例如你在代码中存储了一个版本号信息,那么即便编译成elf文件后,依然能够经过strings查找其间的字符串乃至能够查找某个.c文件是否编译在其间:

strings elfFile| grep "someString"



检查文件段巨细——size


能够经过size指令检查各段巨细:

size cmdTest
   text       data      bss      dec      hex  filename
   1319   &nb心有灵犀一点通sp;  560&溏心风暴3nbsp;       8  &飞越疯人院nbsp;  1887      75f   cmdTest
  • text段:正文段字节数巨细;

  • data段:包括静态变量和现已初始化的全局变量的数据段字节数巨细;

  • bss段:寄存程序中未初始化的全局变量的字节数巨细。

当咱们知道各个段的巨细之后,假如有减小程序巨细的需求,就能够有针对性的对elf文件进行优化处理。


为elf文件”减肥“——strip


strip用于去掉elf文件中一切的符号信息:

ls -al cmdTest
-rwxr-xr-x 1 hyb root 9792 Sep 25 20:30 cmdTest #总巨细为9792字节
strip cmdTest
ls -al cmdTest
-rwxr-xr-x 1 hyb root 6248 Sep 25 20:35 cmdTest#strip之后巨细为6248字节

能够看到,“减肥”之后,巨细削减将近三分之一。

可是要特别注意的是,“减肥”之后的elf文件因为没有了符号信息,许多调试指令将无法正常运用,呈现core dump时,问题也较难定位,因而只主张在正式发布时对其进行“减肥”。


检查elf文件信息——readelf


readelf用于检查elf文件信息,它能够检查各段信息,符号信息等,下面的比如是检查elf文件头信息:

readelf -h cmdTest
  黑道特种兵,人渣的本愿-金博宝 188bet_金博宝体育app_188宝金博下载Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00  #elf文件魔数字
  Class:                     电信套餐; &nb邓瘸子sp;      ELF64  黑道特种兵,人渣的本愿-金博宝 188bet_金博宝体育app_188宝金博下载;#64位 elf文件
  Data:                              2's complement, little endian#字节序为小端序
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V #
  A黑道特种兵,人渣的本愿-金博宝 188bet_金博宝体育app_188宝金博下载BI Version:                       0
  Type:                              EXEC (Executable file)#方针文件类型
  Machine:                           Advanced Micro Devices X86-64 #方针处理器系统
  Version:                 &n时刻轨道新浪博客bsp;         0x1
  Entry point address:               0x400440  #进口地址
  Start of program headers:          64 (bytes into file)
  Start of section headers:          4456 (bytes into&nbs八妻子网址p;file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:   天气预报视频;        56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:        985大学名单排名; 28
  Section header string table index27

从elf头信息中,咱们能够知道该elf是64位可执行文件,运转在x86-64中,且字节序为小端序。别的,咱们还注意到它的进口地址是0x400440(_start),而不是400540(main)。也就是说,咱们的程序运转并非从main开端。


反汇编指定函数——objdump


objdump用于展现elf文件信息,功用较多,在此不逐个介绍。有时候咱们需求反汇编来定位一些问题,能够运用指令:

objdump -d cmdTest #反汇编整个cmdTest程序

可是假如程序较大,那么反汇编时刻将会变长,并且反汇编文件也会很大。假如咱们现已知道了问题在某个函数,只想反汇编某一个函数,怎样处理呢?

咱们能够运用前面介绍的nm指令获取到函数test的地址,然后运用下面的办法反汇编:

objdump -d cmdTest --start-address=0x40052d --stop-address=0x400540 ##反汇编指定地址区间


端口占用状况检查——netstat


咱们或许常常会遇到进程第一次发动后,再次发动会呈现端口绑定失利的问题,咱们能够经过netstat指令检查端口占用状况:

netstat -anp|grep 端口号


core dump文件生成装备——ulimit -c


有时候咱们的程序core dump了却没有生成core文件,很或许是咱们设置的问题:

ulimit -c #检查core文件装备,假如成果为0,程序core dump时将不会生成core文件
ulimit -c unlimited #不约束core文件生成巨细
ulimit -c&n宁财神bsp;10 #设置最大生成巨细为10kb



调试神器——gdb

gdb是一个强壮的调试东西,但这儿仅介绍两个简略运用示例。

有时候程序或许现已正在运转,可是又不能停止它,这时候依然能够运用gdb调试正在运转的进程:

gdb processFile PID #processFile为进程文件,pid为进程id,可经过ps指令查找到

有时候程序或许core dump了,可是系统还留黑道特种兵,人渣的本愿-金博宝 188bet_金博宝体育app_188宝金博下载给了咱们一个礼物——core文件。

在core文件生成装备完结之后,运转cmdTest程序,发生core文件。咱们能够用下面的办法经过core文件定位犯错方位:

gdb cmdTest core #processFile为进程文件,core为生成的core文件
Core was generated by `./cmdTest'.
Program terminated with signal SIGFPE, Arithmeheartbeats是什么意思tic exception.
#0  0x0美丽40080000000004004fb in test (a=10, b=0) at cmdTest.c:4
4   &nbs冰激凌p;     return a/b;
(gdb)bt
#0  0x00000000004004fb in test (a=10, b=0) at cmdTest.c:4
#1  0x0000000000400黑道特种兵,人渣的本愿-金博宝 188bet_金博宝体育app_188宝金博下载52c in main (argc=1, argv=0x7ffca9536d38) at cmdTest.c:10
(gdb)

输入bt后,就能够看到调用栈了,犯错方位在test函数,cmdTest.c的第4行。


定位crash问题——addr2line


有时候程序溃散了但不幸没有生成core文件,是不是就彻底没有办法了呢?仍是cmdTest的比如。运转完cmdTest之后,咱们经过dmesg指令能够获取到以下内容:

[27153070.石纯子李晨538380] trapscmdTest[2836] trap divide error ip:40053b 琳sp:7ffc230d9280 error:0 in cmdTest[400000+1000]


该信息记录了cmdTest运转犯错的根本原因(divide error)和犯错方位(40053b),咱们运用addr2line指令获取犯错详细行号:

addr2line -e cmdTest 40053b
/home/hyb/practice/cmdTest.c:4

能够看到addr2line指令将地址(40053b)翻译成了文件名(cmdTes贾富林t.c)和行号(4),确认了犯错方位。


总结


本文对以上指令仅介绍其经典运用,这些指令都还有其他一些有协助的用法,但因为篇幅有限,不在此介绍,更多运用办法能够经过man指令名的办法去了解。

作者:守望,一名好文学,好技能的开发者。在个人大众号【编程珠玑】共享原创技能文章和学习资源,等待一同交流学习。

声明:本文为作者投稿,版权归作者个人一切。


 热 文 推 荐&水莱丽nbsp;

☞ OPPO 推出 10 亿引力方案,全力构建智能化服务生态

☞ 开除“野狗”式程序员,团队的功率提高了

☞ 16 岁程序媛遭停学轻视死亡威胁,最终是怎么开宣布爆款使用的?

☞ 雷军:掌握金山纯属意外

☞ 关于5G接入网,看这一篇就够啦!

☞ 甭说创业维艰,16岁开发者从停学轻视死亡威胁, 到开宣布爆款使用, 她的人生远非成人幻想

☞ AI in 美团:吃喝玩乐背面的黑科技

☞ 老程序员内心劝告:千万别一辈子靠技能生计!

print_r('点个美观吧!');
var_dump('点个美观吧!');
NSLog(@"点个美观吧!");
System.out.println("点个美观吧!");
console.log("点个美观吧!");
print("点个美观吧!");
printf("点个美观吧!\n");
cout << "点个美观吧!" << endl;
Console.WriteLine("点个美观吧!");
fmt.Println("点个美观吧!");
Response.Write("点个美观吧!");
alert("点个美观吧!")
echo "点个美观吧!"

点击“阅览原文”,翻开 CSDN App 阅览更交心!

喜爱就点击“美观”吧!

转载原创文章请注明,转载自金博宝 188bet_金博宝体育app_188宝金博下载,原文地址:http://www.0newpoints.com/articles/531.html

上一篇:宫颈糜烂用什么药,周口天气-金博宝 188bet_金博宝体育app_188宝金博下载

下一篇:南阳,萝卜糕的做法-金博宝 188bet_金博宝体育app_188宝金博下载