使用 Strace 和 GDB 调试工具的乐趣Word下载.docx

上传人:b****3 文档编号:6501893 上传时间:2023-05-06 格式:DOCX 页数:8 大小:21.48KB
下载 相关 举报
使用 Strace 和 GDB 调试工具的乐趣Word下载.docx_第1页
第1页 / 共8页
使用 Strace 和 GDB 调试工具的乐趣Word下载.docx_第2页
第2页 / 共8页
使用 Strace 和 GDB 调试工具的乐趣Word下载.docx_第3页
第3页 / 共8页
使用 Strace 和 GDB 调试工具的乐趣Word下载.docx_第4页
第4页 / 共8页
使用 Strace 和 GDB 调试工具的乐趣Word下载.docx_第5页
第5页 / 共8页
使用 Strace 和 GDB 调试工具的乐趣Word下载.docx_第6页
第6页 / 共8页
使用 Strace 和 GDB 调试工具的乐趣Word下载.docx_第7页
第7页 / 共8页
使用 Strace 和 GDB 调试工具的乐趣Word下载.docx_第8页
第8页 / 共8页
亲,该文档总共8页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

使用 Strace 和 GDB 调试工具的乐趣Word下载.docx

《使用 Strace 和 GDB 调试工具的乐趣Word下载.docx》由会员分享,可在线阅读,更多相关《使用 Strace 和 GDB 调试工具的乐趣Word下载.docx(8页珍藏版)》请在冰点文库上搜索。

使用 Strace 和 GDB 调试工具的乐趣Word下载.docx

.

fstat64(3,{st_mode=S_IFREG|0644,st_size=115031,...})=0

old_mmap(NULL,115031,PROT_READ,MAP_PRIVATE,3,0)=0x40017000

close(3) 

=0

open("

/lib/tls/libc.so.6"

O_RDONLY) 

=3

read(3,"

\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360U\1"

...,1024)=1024

fstat64(3,{st_mode=S_IFREG|0755,st_size=1547996,...})=0

old_mmap(0x42000000,1257224,PROT_READ|PROT_EXEC,MAP_PRIVATE,3,0)=0x42000000

mprotect(0x4212e000,20232,PROT_NONE) 

old_mmap(0x4212e000,12288,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,3,0x12e000)...

old_mmap(0x42131000,7944,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,...

set_thread_area({entry_number:

-1->

6,base_addr:

0x40016ac0,limit:

1048575,seg_32bit...

munmap(0x40017000,115031) 

brk(0x804d000) 

=0x804d000

=0x804d000

/usr/lib/locale/locale-archive"

O_RDONLY|O_LARGEFILE)=3

fstat64(3,{st_mode=S_IFREG|0644,st_size=30301680,...})=0

mmap2(NULL,2097152,PROT_READ,MAP_PRIVATE,3,0)=0x40017000

brk(0x804e000) 

=0x804e000

getcwd("

/home/bill"

4096) 

=11

fstat64(1,{st_mode=S_IFCHR|0600,st_rdev=makedev(136,6),...})=0

mmap2(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)=0x4021700...

write(1,"

/home/bill\n"

11/home/bill

) 

munmap(0x40217000,4096) 

=0

exit_group(0) 

=?

________________________________________

UNIX系统调用的具体细节

关于检索和显示当前工作目录所需的所有系统调用的详细细节,已经超出了本文的讨论范围,但我会介绍如何获取这些信息。

清单1中的每一行都以类似C的格式,清楚地说明了一项系统调用及其参数,这也是C程序员希望看到的。

Strace同样以这种方式显示这些调用,不管在实际创建该程序时使用的是何种编程语言。

如果要了解清单1中的所有细节信息,对于所有这些系统调用,UNIX为您提供了大量的文档。

清单1中“最重要”的函数是getcwd()函数,它表示获取当前工作目录。

当前的xterm显示了stracepwd的输出,同时再启动另一个xterm并输入下面的命令以查看UNIX对该函数的显示:

$mangetcwd

您所看到的应该是getcwd()函数完整的清单以及这个重要的C函数需要的和返回的参数清单。

同样地,您可以输入manbrk或manfstat64等等。

通常,UNIX系统通过文档对这些系统函数进行了详细的说明,如果花些时间仔细地研究它们,您将逐渐地了解到UNIX的功能是多么的强大,以及学习这些底层系统细节是多么的容易。

在所有的操作系统中,UNIX最善于帮助您理解其底层的处理过程。

观察nweb

对于下面几个步骤,您需要使用更庞大且更复杂的程序,而不是像pwd这样简单的UNIX命令。

简单的超文本传输协议(HTTP)服务器,如nweb,是非常适合的。

当您在Internet上冲浪的时候,HTTP服务器侦听浏览器请求,然后通过发送所请求的对象,如Web页面和图形文件,以此响应浏览器的请求。

下载并安装nweb,该软件由IBMdeveloperWorks投稿作家NigelGriffiths编写。

'

"

(请参阅参考资料部分提供的Nigel的文章“nweb:

?

atiny,safeWebserver(staticpagesonly)”(developerWorks,2004年6月)的链接。

下载es-nweb.zip到$HOME/downloads目录,然后输入清单2中所示的简单命令,以提取、编译并启动该程序:

注意:

我假设您需要为Linux&

reg;

工作站编译这个程序。

如果实际情况并非如此,那么有关在其他的UNIX操作系统上对该程序进行编译的详细信息,请阅读这篇nweb文章。

清单2.用于提取、编译和启动nweb的命令

$cdsrc

$mkdirnweb

$cdnweb

$unzip$HOME/downloads/es-nweb.zip

$gcc-ggdb-O-DLINUXnweb.c-onweb

$./nweb9090$HOME/src/nweb&

清单2中的-ggdb选项和Nigel的文章中的内容有些不同,该选项用于告诉GCC编译器对该程序进行优化,以便使用GDB调试工具对其进行调试,您将在以后用到该调试工具。

接下来,要确认nweb服务器已经运行,可以使用清单3中所示的ps命令来对它进行检查。

清单3.ps命令

$ps

PIDTTY 

TIMECMD

2913pts/5 

00:

00:

00bash

4009pts/5 

00nweb

4011pts/5 

00ps

最后,要确认nweb确实正在运行并且状态正常,可以在您的计算机上启动一个Web浏览器并在地址栏中输入http:

//localhost:

9090。

针对nweb使用strace

现在,让我们来进行一些有趣的工作。

启动另一个xterm,然后使用strace来跟踪正在运行的nweb服务器。

要完成该任务,您必须清楚该程序的进程ID,并且必须具有适当的权限。

您仅仅可以看到一组特定的系统调用,即那些与网络相关的系统调用。

输入清单4第一行所示的命令作为开始,其中使用了前面显示的nweb的进程ID。

您应该看到如下的输出(清单4中的第二行)。

清单4.开始对nweb进行跟踪

$strace-etrace=network-p4009

accept(0,

请注意,在调用网络accept()函数的过程中停止了跟踪操作。

在浏览器中刷新几次http:

9090页面,请注意每次刷新该页面时strace的显示。

这是不是很棒呢?

您所看到的是,当Web浏览器调用HTTP服务器(nweb)时,服务器所进行的底层网络调用。

简单地说,nweb正在接受来自您的浏览器的调用。

您可以在运行strace的具有窗口焦点的xterm中按下Ctrl+C以停止对网络调用的跟踪。

再来研究GDB调试工具

正如您所看到的,strace可以作为了解用户程序如何通过某些系统调用与操作系统进行交互的一个很好的程序。

GDB调试工具本身也可以附加于一个正在运行的进程,并帮助您进行更深入的研究。

GDB调试工具非常有用,Internet上提供了大量的有关该工具的可用信息。

通常,调试工具是很有价值的工具,并且任何负责开发和维护计算机系统的人员应该了解如何使用它们。

因此,在nweb运行于另一个xterm会话的同时,按下Ctrl+C停止strace,然后输入清单5中所示的命令启动GDB调试工具。

清单5.启动GDB调试工具

$gdb--quiet

(gdb)attach4009

Attachingtoprocess4009

Readingsymbolsfrom/home/bill/src/nweb/nweb...done.

Readingsymbolsfrom/lib/tls/libc.so.6...done.

Loadedsymbolsfor/lib/tls/libc.so.6

Readingsymbolsfrom/lib/ld-linux.so.2...done.

Loadedsymbolsfor/lib/ld-linux.so.2

0xffffe410in?

?

()

(gdb)

-quiet选项告诉GDB调试工具仅显示其提示符,而不要显示所有其他的启动信息。

如果需要显示额外的文本信息,可以去掉-quiet选项。

attach4009命令启动对当前正在运行的nweb服务器的调试工作,并且GDB调试工具通过读取有关该进程的所有的符号信息来做出同样方式的响应。

下一步,使用info命令来列举您所研究的程序的相关信息(请参见清单6)。

清单6.info命令列出程序信息

(gdb)infoproc

process4009

cmdline='

./nweb'

cwd='

/home/bill/src/nweb'

exe='

/home/bill/src/nweb/nweb'

info命令(请参见清单7)的另一个有用的变种是infofunctions,然而,函数的列表可能很长。

清单7.infofunctions命令得到的函数列表

(gdb)infofunctions

Alldefinedfunctions:

Filenweb.c:

voidlog(int,char*,char*,int);

intmain(int,char**);

voidweb(int,int);

File__finite:

int__finite();

(gdb) 

因为使用-ggdb选项对nweb程序进行了编译,所以可执行文件中包含了大量的调试信息,允许该调试工具查看文件中列举的已定义的函数,如清单7所示。

list和disassemble命令

有两个重要的GDB调试工具命令,它们分别是list和disassemble。

通过使用清单8中所示的代码尝试使用这些命令。

清单8.list命令

(gdb)listmain

121 

exit

(1);

122 

}

123

124

125 

main(intargc,char**argv)

126 

{

127 

inti,port,pid,listenfd,socketfd,hit;

128 

size_tlength;

129 

char*str;

130 

staticstructsockaddr_incli_addr;

/*static=initialisedtozeros*/

(gdb)

131 

staticstructsockaddr_inserv_addr;

132

133 

if(argc<

||argc>

3||!

strcmp(argv[1],"

-?

)){

134 

(void)printf("

hint:

nwebPort-NumberTop-Directory\n\n"

135 

"

\tnwebisasmallandverysafeminiwebserver\n"

136 

\tnwebonlyserversoutfile/webpageswithextensionsnamedbelow\n"

137 

\tandonlyfromthenameddirectoryoritssub-directories.\n"

138 

\tThereisnofancyfeatures=safeandsecure.\n\n"

139 

\tExample:

nweb8181/home/nwebdir&

\n\n"

140 

\tOnlySupports:

);

正如您所看到的,list命令以源文件的形式列出了正在运行的程序,并标注了相应的行号。

按下Return键(如第130行和第131行之间所示)以接着上次的列表继续进行列举。

现在,尝试使用disassemble命令,可以缩写为disass(请参见清单9)。

清单9.disassemble命令

(gdb)disassmain

Dumpofassemblercodeforfunctionmain:

0x08048ba2<

main+0>

:

push 

ebp

0x08048ba3<

main+1>

mov 

ebp,esp

0x08048ba5<

main+3>

edi

0x08048ba6<

main+4>

esi

0x08048ba7<

main+5>

ebx

0x08048ba8<

main+6>

sub 

esp,0xc

0x08048bab<

main+9>

ebx,DWORDPTR[ebp+12]

0x08048bae<

main+12>

and 

esp,0xfffffff0

0x08048c01<

main+95>

call 

0x8048664<

printf>

0x08048c06<

main+100>

add 

esp,0x10

0x08048c09<

main+103>

inc 

esi

0x08048c0a<

main+104>

cmp 

DWORDPTR[ebx+esi],0x0

---Type<

return>

tocontinue,orq<

toquit---

反汇编清单显示了该main函数的汇编语言清单。

在本示例中,汇编代码指示出运行该代码的计算机使用的是Intel&

Pentium&

处理器。

如果该程序运行于不同类型的处理器上,如基于IBMPowerPC&

的计算机,那么您的代码看上去将有很大的区别。

在其运行的过程中进行监视

因为您所监视的是一个正在运行的程序,所以可以设置相应的断点,然后在它响应浏览器请求并向提出请求的浏览器传输.html和.jpg文件的同时,对该程序进行监视。

清单10介绍了如何完成该任务。

清单10.设置断点

(gdb)break188

Breakpoint1at0x8048e70:

filenweb.c,line188.

(gdb)commands1

Typecommandsforwhenbreakpoint1ishit,oneperline.

Endwithalinesayingjust"

end"

.

>

continue

end

(gdb)c

Continuing.

此时,GDB调试工具已设置为在nweb服务器接受浏览器请求处进行中断,该调试工具将仅仅显示相应的请求并继续处理其他的请求,而不会中断正在运行的程序。

刷新几次浏览器中的http:

9090/页面,可以观察到,GDB调试工具显示了断点并继续运行。

在刷新浏览器页面的同时,您应该看到如清单11所示的断点信息,在GDB调试工具xterm中滚动输出。

与strace相同,您可以按下Ctrl+C来停止对nweb服务器的调试。

在停止了跟踪操作之后,您可以输入quit命令以退出GDB调试工具。

清单11.GDB调试工具xterm中的断点信息

Breakpoint1,main(argc=3,argv=0x1)atnweb.c:

188

188if((socketfd=accept(listenfd,(structsockaddr*)&

cli_addr,&

length))<

0)

ProgramreceivedsignalSIGINT,Interrupt.

(gdb)quit

Theprogramisrunning. 

Quitanyway(anddetachit)?

(yorn)y

Detachingfromprogram:

/home/bill/src/nweb/nweb,process4009

$

请注意,您正告诉GDB调试工具停止对一个仍在内存中活动的程序的调试。

即使是在退出了调试工具之后,您还可以刷新浏览器页面,并将看到nweb仍在运行。

可以输入kill4009命令来停止该程序,或者在您

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2