使用 Strace 和 GDB 调试工具的乐趣Word下载.docx
- 文档编号:6501893
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:8
- 大小:21.48KB
使用 Strace 和 GDB 调试工具的乐趣Word下载.docx
《使用 Strace 和 GDB 调试工具的乐趣Word下载.docx》由会员分享,可在线阅读,更多相关《使用 Strace 和 GDB 调试工具的乐趣Word下载.docx(8页珍藏版)》请在冰点文库上搜索。
.
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<
3
||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命令来停止该程序,或者在您
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 Strace GDB 调试工具的乐趣 调试 工具 乐趣