成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux addr2line具體應(yīng)用指南

運(yùn)維 系統(tǒng)運(yùn)維
學(xué)問來自實(shí)踐,但是對于調(diào)試工具,在沒有出現(xiàn)問題而迫使您去修復(fù)它們之前,“實(shí)踐”是不會(huì)發(fā)生的。考慮到這點(diǎn),下面將提供Linux addr2line讓您入門的“速成”指南。

調(diào)試zSeries上的Linux應(yīng)用程序類似于調(diào)試其他體系結(jié)構(gòu)上的Linux應(yīng)用程序。對于有經(jīng)驗(yàn)的Linux開發(fā)人員,最大的挑戰(zhàn)是理解新的系統(tǒng)體系結(jié)構(gòu)。對于剛接觸Linux的大型機(jī)開發(fā)人員,掌握新的調(diào)試工具似乎是一項(xiàng)令人畏懼的任務(wù)。不要害怕。本文將提供Linux addr2line一些有用的提示來幫助您入門。

UserDebug日志記錄

調(diào)試一個(gè)崩潰的程序的第一步是弄清哪里出了錯(cuò)。zSeries上的Linux內(nèi)核具有這樣一個(gè)內(nèi)置特性,它在用戶進(jìn)程崩潰時(shí)記錄一些基本的調(diào)試信息。要啟用這個(gè)特性,請以root用戶身份執(zhí)行如下命令:
echo1>>/proc/sys/kernel/userprocess_debug

當(dāng)某個(gè)進(jìn)程崩潰時(shí),日志文件(/var/log/messages)中就會(huì)給出附加的信息,包括程序終止原因、故障地址,以及包含程序狀態(tài)字(PSW)、通用寄存器和訪問寄存器的簡要寄存器轉(zhuǎn)儲(chǔ)。
 

  1. Mar3111:34:28l02kernel:Userprocessfault:interruptioncode0x10  
  2. Mar3111:34:28l02kernel:failingaddress:0  
  3. Mar3111:34:28l02kernel:CPU:1  
  4. Mar3111:34:28l02kernel:Processsimple(pid:30122,stackpage=05889000)  
  5. Mar3111:34:28l02kernel:  
  6. Mar3111:34:28l02kernel:UserPSW:070dc000c00ab738  
  7. Mar3111:34:28l02kernel:task:05888000ksp:05889f08pt_regs:05889f68  
  8. Mar3111:34:28l02kernel:UserGPRS:Mar3111:34:28l02kernel:00000000004019a0004019a000000000  
  9. Mar3111:34:28l02kernel:00000003c00ab732004008f800400338  
  10. Mar3111:34:28l02kernel:40018ffc0040061c40018e347ffff800  
  11. Mar3111:34:28l02kernel:00400434804006248040066e7ffff800  
  12. Mar3111:34:28l02kernel:UserACRS:  
  13. Mar3111:34:28l02kernel:00000000000000000000000000000000  
  14. Mar3111:34:28l02kernel:00000001000000000000000000000000  
  15. Mar3111:34:28l02kernel:00000000000000000000000000000000  
  16. Mar3111:34:28l02kernel:00000000000000000000000000000000  
  17. Mar3111:34:28l02kernel:UserCode:  
  18. Mar3111:34:28l02kernel:4440500007fea74a0001185418431835a8240000  

 

上面表明程序(名為“simple”)以一個(gè)程序中斷代碼0x10終止(操作系統(tǒng)原理表明這是一個(gè)段轉(zhuǎn)換錯(cuò)誤),而故障地址為0。毫無疑問,有人使用了空指針。現(xiàn)在我們知道發(fā)生了什么,下面需要弄清它發(fā)生在何處。

Linux addr2line基本的診斷

UserDebug日志條目所提供的信息可用于確定程序的崩潰位置。一些可用的工具可幫助解決您可能會(huì)遇到的各種程序終止問題。我們將在本文中逐步介紹那些工具。

首先,讓我們檢查一下該日志條目中的用戶PSW。該P(yáng)SW包含指令地址、狀態(tài)碼以及關(guān)于機(jī)器狀態(tài)的其他信息。眼下,我們僅關(guān)心指令地址(第33至第63位)。為簡化起見,讓我們假設(shè)用戶PSW是070dc00080400618。記住,我們是在考察一個(gè)ESA/390(31位尋址)PSW。第32位不是指令地址的一部分,它是指示31位尋址模式的標(biāo)志,但是在研究PSW值時(shí)必須處理它。為了獲得實(shí)際的指令指針,可把PSW的第二個(gè)字減去0x80000000。結(jié)果是一個(gè)指令地址0x400618。為了定位代碼,您需要可執(zhí)行文件中的一些信息。首先使用readelf來打印一些程序頭信息。
 

  1. ElffiletypeisEXEC(Executablefile)Entrypoint0x400474Thereare6programheaders,startingatoffset52ProgramHeaders:  
  2. TypeOffsetVirtAddrPhysAddrFileSizMemSizFlgAlign  
  3. PHDR0x0000340x004000340x004000340x000c00x000c0RE0x4  
  4. INTERP0x0000f40x004000f40x004000f40x0000d0x0000dR0x1[Requestingprograminterpreter:/lib/ld.so.1]  
  5. LOAD0x0000000x004000000x004000000x009900x00990RE0x1000  
  6. LOAD0x0009900x004019900x004019900x000fc0x00114RW0x1000  
  7. DYNAMIC0x0009ac0x004019ac0x004019ac0x000a00x000a0RW0x4  
  8. NOTE0x0001040x004001040x004001040x000200x00020R0x4  
  9. SectiontoSegmentmapping:SegmentSections...  
  10. 00  
  11. 01.interp  
  12. 02.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version  
  13. .gnu.version_r.rela.got.rela.plt.init.plt.text.fini.rodata  
  14. 03.data.eh_frame.dynamic.ctors.dtors.got.bss  
  15. 04.dynamic  
  16. 05.note.ABI-tag  

 

上述顯示了readelf-lsimple的結(jié)果(記住“simple”是我們的測試程序的名稱)。在ProgramHeaders部分,第一個(gè)LOAD行提供了關(guān)于程序從哪里加載的信息。在Flg列,該段被標(biāo)記為R(read)E(executable)。VirtAddr是程序開始加載的地址。MemSiz是正在被加載到這個(gè)段中的代碼長度。把它加到VirtAddr上,這個(gè)程序的基本地址范圍就是0x400000-0x400990。程序發(fā)生崩潰的指令地址為0x400618,在程序的加載范圍之內(nèi)。現(xiàn)在我們知道了問題直接發(fā)生在代碼中。

如果可執(zhí)行文件包括調(diào)試符號,那么確定哪一行代碼導(dǎo)致了問題是可以做到的。對該地址和可執(zhí)行文件使用addr2line程序,如下所示:
addr2line-esimple0x400618

將返回:
/home/devuser/simple.c:34

要研究該問題,可以檢查第34行。

對于Linux addr2line原始的程序崩潰,PSW為070dc000c00ab738。要獲得指令地址,可減去0x80000000。結(jié)果為0x400ab738。這個(gè)地址并不準(zhǔn)確地落在我們的小程序之內(nèi)。那么,它是什么呢?是來自共享庫的代碼。如果對可執(zhí)行文件運(yùn)行l(wèi)dd命令(lddsimple),將會(huì)返回程序運(yùn)行所需的共享對象的列表,以及該庫在那里可用的地址。
libc.so.6=>/lib/libc.so.6(0x40021000)/lib/ld.so.1=>/lib/ld.so.1(0x40000000)

該指令地址對應(yīng)于加載libc.so.6的地址。在我們的簡單測試案例中,只需要兩個(gè)共享對象。其他應(yīng)用程序可能需要更多共享對象,這使得ldd的輸出更加復(fù)雜。我們將以perl作為例子。輸入:
ldd/usr/bin/perl

將得到:
 

  1. libnsl.so.1=> 
  2. /lib/libnsl.so.1(0x40021000)libdl.so.2=> 
  3. /lib/libdl.so.2(0x40039000)libm.so.6=> 
  4. /lib/libm.so.6(0x4003d000)libc.so.6=> 
  5. /lib/libc.so.6(0x40064000)libcrypt.so.1=> 
  6. /lib/libcrypt.so.1(0x4018f000)/lib/ld.so.1=> 
  7. /lib/ld.so.1(0x40000000)  

 

所需要的一切都在那里了,但是我發(fā)現(xiàn)對于這個(gè)進(jìn)程,下面的內(nèi)容讀起來更快一點(diǎn):
 

  1. ldd/usr/bin/perl|awk‘{print?$4““$3}’  
  2. |sort(0x40000000)/lib/ld.so.1(0x40021000)  
  3. /lib/libnsl.so.1(0x40039000)  
  4. /lib/libdl.so.2(0x4003d000)  
  5. /lib/libm.so.6(0x40064000)  
  6. /lib/libc.so.6(0x4018f000)  
  7. /lib/libcrypt.so.1  

 

現(xiàn)在我們來確定Linux addr2line崩潰發(fā)生在libc中的何處。假設(shè)libc.so.6的加載地址是0x40021000,從指令地址0x400ab738減去它,結(jié)果為0x8a738。這是進(jìn)入libc.so.6的偏移。使用nm命令,從libc.so.6轉(zhuǎn)儲(chǔ)符號,然后嘗試確定該地址位于哪個(gè)函數(shù)中。對于libc.so.6,nm將生成7,000多行輸出。通過對計(jì)算得出的偏移部分執(zhí)行g(shù)rep(正則表達(dá)式查找程序)可以削減必須檢查的數(shù)據(jù)量。輸入:
nm/lib/libc.so.6|sort|grep0008a

將返回66行,在該輸出的中間,我們會(huì)發(fā)現(xiàn):
0008a6fcTmemcpy0008a754t_wordcopy_fwd_aligned

該偏移落在memcpy中的某個(gè)位置。在此例中,一個(gè)空指針被當(dāng)作目標(biāo)地址傳遞給了memcpy。我們在何處調(diào)用的memcpy呢?問得好。我們可以通過檢查輸出在日志文件中的寄存器轉(zhuǎn)儲(chǔ)來確定目標(biāo)區(qū)域。寄存器14包含執(zhí)行某個(gè)函數(shù)調(diào)用時(shí)的返回地址。根據(jù)圖1,R14是0x8040066e,它在截去高位之后產(chǎn)生一個(gè)地址0x40066e。這個(gè)地址落在我們的程序范圍之內(nèi),因此可以運(yùn)行addr2line來確定該地址在何處。輸入:
addr2line-esimple0x40066e

將返回:
/home/devuser/simple.c:36

這是我們調(diào)用memcpy之后的那一行。關(guān)于addr2line的一點(diǎn)補(bǔ)充:如果可執(zhí)行文件中沒有包括調(diào)試符號,您將獲得??:0作為響應(yīng)。

【編輯推薦】

  1. Linux 查看磁盤空間實(shí)現(xiàn)代碼介紹
  2. Linux操作系統(tǒng)需要微軟的十大幫助
  3. 探尋Linux到底需要多低的配置
  4. Linux測試工具tcpdump監(jiān)視TCP/IP連接命令介紹
  5. Linux流量控制實(shí)例應(yīng)用介紹 
     
責(zé)任編輯:chenqingxiang 來源: 百度
相關(guān)推薦

2025-07-01 02:44:00

2010-06-23 15:41:44

Linux Bash

2010-05-27 11:03:44

Linux流量控制

2010-06-18 10:24:51

Linux acces

2011-02-22 15:06:48

openVPN

2009-12-31 17:17:45

Silverlight

2022-02-25 11:39:23

Linux軟件

2011-08-17 14:07:43

IOS開發(fā)Quartz 2D

2009-12-30 15:47:40

Silverlight

2021-03-02 08:00:00

項(xiàng)目管理組織工具

2010-01-28 11:26:39

Android log

2022-10-27 14:25:46

無服務(wù)器Serverless云原生

2009-12-31 15:36:13

SilverLight

2009-11-30 13:15:27

PHP模板Smarty

2009-12-31 15:36:13

SilverLight

2012-03-21 09:47:48

2019-05-09 11:08:13

混合云公共云云計(jì)算

2009-07-15 09:59:36

MyEclipse使用

2009-07-15 09:59:36

MyEclipse使用

2023-10-16 10:25:34

數(shù)據(jù)科學(xué)大數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美成人视屏 | 在线色网| 亚洲欧美激情精品一区二区 | 国产精品乱码一区二区三区 | 粉嫩国产精品一区二区在线观看 | 自拍偷拍精品 | 中文av电影 | 色视频网站在线观看 | 国产三级大片 | 色综合美女 | 亚洲一区二区久久 | 99成人免费视频 | 日韩一区二区在线视频 | 日韩精品久久久 | 成人av在线大片 | 91麻豆精品国产91久久久更新资源速度超快 | 毛片视频免费观看 | 97操操| 亚洲欧美中文日韩在线v日本 | 女同久久另类99精品国产 | 欧美精品中文字幕久久二区 | 成年人免费看的视频 | 亚洲色图婷婷 | 亚洲高清视频一区 | 国产成人精品一区二区 | 日本久草 | 国产精品久久国产精品 | 国产精品久久久久久久久久尿 | 欧美激情免费在线 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 色综合久 | 亚洲电影免费 | 热re99久久精品国99热观看 | 久久久高清 | 日韩在线看片 | 国产精品视频一区二区三区 | 国产精品久久久久久久岛一牛影视 | 91精品一区二区三区久久久久久 | 天久久| 亚洲一区二区在线视频 | 先锋资源在线 |