《MDB中的基本命令》由会员分享,可在线阅读,更多相关《MDB中的基本命令(25页珍藏版)》请在金锄头文库上搜索。
1、北京大学软件研究所操作系统实验室1MDB基础基础1.1 mdb 中的基本命令中的基本命令1.1.1mdb 中命令的使用中命令的使用1)mdb 中中输输入命令的格式是:入命令的格式是:expression:dcmd e.g. 0x300acde123:ps2)通通过过:dmods l !less 或者 :dcmds 可以找到可以找到 mdb 中的命令。如果需要翻中的命令。如果需要翻页查页查找,可以在命令后面加上找,可以在命令后面加上 !less。 。3)如果需要了解一个命令的参数,如果需要了解一个命令的参数, 输输入入:help 命令名 例如,查看 ps 命令的更多信息: :help ps 1.
2、1.2 数据数据结结构列表构列表1)通通过输过输入入:walkers (for a list) expression:walk e.g. :walk cpu 显显示指定数据示指定数据结结构的列表构的列表2018-04-20mdb 实验指导1.1.3 宏命令宏命令1)通通过输过输入入!ls /usr/lib/adb查查找找 mdb 中的宏命令。中的宏命令。2)宏命令的使用格式宏命令的使用格式expression$ e.g. cpu0:print cpu_tcpu_t:sizeof1.1.5 管道管道1)表达式、表达式、mdb 命令、命令、walk 命令都可以用管道命令都可以用管道连连接起来接起来
3、:walk | :dcmd e.g. :walk cpu | :print cpu_t1.1.6 列表列表address:list e.g. 0x70002400000:list page_t p_vpnext1.1.7 日志功能日志功能1)通通过输过输入入:log /tmp/logfile可以把在可以把在 mdb 里面后里面后续续操作的操作的结结果果输输出到出到/tmp/logfile 文件中。文件中。1.2 用用 mdb 调试调试一个程序一个程序1)查查看系看系统调统调用号所用号所对应对应的名称的名称bash-3.00$ cat /etc/name_to_sysnum2)构造一个可供构造一
4、个可供调试调试的程序的程序bash-3.00$ cat getpid.c bash-3.00$ cc -o getpid getpid.c O3)启启动动 mdb,把生成的可,把生成的可执执行文件名作行文件名作为为参数。参数。bash-3.00$ mdb ./getpid4)在在 main 函数入口函数入口设设置断点。置断点。main:b5)运行程序。运行程序。:r6)在在 getpid 函数入口函数入口设设置断点。置断点。 getpid:b7)从当前断点从当前断点处继续执处继续执行。行。:c2018-04-20mdb 实验指导8)从当前从当前 PC 所指的地址所指的地址处处开始,开始,显显示
5、两个字示两个字节节的指令。的指令。.,2/ai .,2/a2 进程、线程和调度进程、线程和调度2.1 通通过过 proc 结结构构查查看看 threads 结结构构2.1.1 目目标标查看进程 nscd 的线程信息。 2.1.2 操作步操作步骤骤1)打开一个控制打开一个控制终终端,以端,以 root 身份,身份,键键入:入: # mdb -k2)在在 mdb 里面,里面, 输输入:入::ps !grep nscd proc 结结构的地址会构的地址会显显示在示在 命令名所在列的前一列,列名命令名所在列的前一列,列名为为 ADDR(下面假下面假设为设为ffffffff80c45cd8) 。 。3)
6、3) 显显示示 proc_t 数据数据结结构,构,键键入:入: ffffffff80c45cd8:print proc_t 4)4) 显显示示 proc_t 中的中的线线程的信息,程的信息,键键入:入: ffffffff80c45cd8:walk thread 5)5) 显显示示 proc_t 中的每个中的每个线线程的函数程的函数调调用的堆用的堆栈栈信息,信息,键键入:入: ffffffff80c45cd8:walk thread|:findstack6)6) 查查看系看系统统中所有中所有线线程的信息,程的信息,键键入:入: :walk thread2018-04-20mdb 实验指导7)7)
7、 查查看看 nscd 进进程中所有程中所有线线程的稍微程的稍微详细详细一些的信息,一些的信息,键键入:入: ffffffff80c45cd8:walk thread|:threadlist -v8)8) 查查看看 nscd 进进程中所有程中所有线线程的稍微程的稍微详细详细一些的信息,一些的信息,键键入:入: ffffffff80c45cd8:walk thread|:threadlist -v9)9) 可以可以继续查继续查看看 lwp 的信息,的信息,键键入:入: ffffffff80c45cd8: print klwp_t2.1.2.2 结论结论在本实验中, 我们从 proc(或者 pid)
8、数据结构出发,找到 kthread 结构,并查看了 lwp 结 构。2.2 通通过过 Cpuinfo 结结构构查查看看 threads 结结构构 2.2.1 目目标标通过 CPU 信息的数据结构,查看运行在该 CPU 上的线程信息。2.2.2 操作步操作步骤骤1)打开一个控制打开一个控制终终端,以端,以 root 身份,身份,键键入:入: # mdb -k2)在在 mdb 里面,里面, 输输入:入::cpuinfo -v这时这时,就可以看到每个(如果有多个,就可以看到每个(如果有多个 CPU 的的话话) )CPU 上正在运行的上正在运行的线线程程结结构的起始地址。构的起始地址。也可以也可以继续
9、输继续输入以下命令,在入以下命令,在 CPU 数据数据结结构中构中查查找找线线程程结结构的起始地址。构的起始地址。3)3) 显显示示 cpu 数据数据结结构的起始地址,构的起始地址,键键入:入: :walk cpu4)4) 显显示示 cpu 数据数据结结构的起始地址,同构的起始地址,同时显时显示示该该数据数据结结构的内容,构的内容,键键入:入: :walk cpu | :print cpu_t 5)5) 在在 cpu_t 数据数据结结构里面,可以找到构里面,可以找到 cpu_thread 数据数据结结构,就是要找的当前正在构,就是要找的当前正在 CPU 上运上运行的行的线线程,程,键键入:入:
10、 :walk cpu | :print cpu_t 6)6) 假假设线设线程起始地址程起始地址为为 0xffffffff832ae5c0, ,显显示示该该数据数据结结构的内容,构的内容,键键入:入: 0xffffffff832ae5c0:print kthread_t2.2.2.2 结论结论在本在本实验实验中,中, 我我们们从从 cpu 数据数据结结构出构出发发,找到,找到 kthread 结结构。由于每个构。由于每个 CPU 上至少有一上至少有一个个线线程在运行,所以很容易程在运行,所以很容易获获得当前正在运行得当前正在运行线线程的信息。程的信息。2018-04-20mdb 实验指导2.3
11、通通过过 syscall 查查看看 proc 结结构构2.3.1 目目标标查看一个正在通过系统调用等待用户输入的进程 2.3.2 操作步操作步骤骤1)在在 控制控制终终端的端的#提示符下,提示符下, 输输入:入: # more /usr/include/sys/syscall.h2)另外打开一个控制另外打开一个控制终终端,以端,以 root 身份,身份,键键入:入: # mdb -k3)在在 mdb 里面,里面, 输输入:入::ps4)proc 结结构的地址会构的地址会显显示在示在 命令名所在列的前一列,列名命令名所在列的前一列,列名为为 ADDR,要,要显显示更多的示更多的 proc 结结构
12、的信息,构的信息,输输入:入: :address $/dev/null由于由于 read 系系统调统调用每次使用相同的用每次使用相同的缓缓冲区,所以冲区,所以这这条命令条命令查查到的到的缓缓冲区的地址,与冲区的地址,与 od程序打开其他文件程序打开其他文件时时使用的使用的缓缓冲区地址相同,假冲区地址相同,假设设是是 8066acc。 。2)其次运行其次运行 od 程序,程序,显显示示输输出出/usr/dict/words 文件。把文件。把结结果通果通过过管道,管道,输输出出给给 more 程序。程序。/usr/dict/words 文件比文件比较长较长,一屏,一屏显显示不完,可以通示不完,可以
13、通过过 more 的作用,使得的作用,使得 od 程序不要退程序不要退出,从而保留内存状出,从而保留内存状态态,供我,供我们们下面在下面在 mdb 中研究。中研究。bash-3.00# od -c /usr/dict/words |more3)以以 root 身份,启身份,启动动 mdb。在控制。在控制终终端的端的#提示符下,提示符下, 输输入:入: # mdb -k 4)找到找到 od 进进程的程的 proc_t 结结构起始地址,构起始地址, 输输入:入: :ps !grep od5)利用利用该该 proc_t 结结构地址,假构地址,假设设是是 d6684050,找到虚存空,找到虚存空间间数
14、据数据结结构构 p_as 起始地址,遍起始地址,遍历历其中的其中的 seg 数据数据结结构,构,输输出每个出每个 seg 的基本信息,的基本信息, 输输入:入: d6684050:print proc_t p_as |:walk seg |:seg od 进进程的多个段中,我程的多个段中,我们们感感兴兴趣的段是包含趣的段是包含 read 系系统调统调用使用的用使用的缓缓冲区虚地址(假冲区虚地址(假设设为为 08066ACC)的段。找到)的段。找到该该段的数据段的数据结结构起始地址,假构起始地址,假设为设为 d7795448。 。6)显显示示该该段的段的 segvn_data_t 数据数据结结构
15、,构, 输输入:入: d7795448:print segvn_data_t在在 segvn_data_t 数据数据结结构中找到指向匿名内存构中找到指向匿名内存(anonymousanonymous mapmap)数据数据结结构的指构的指针针, , 假假设设为为 d7f6df00。 。7)显显示匿名内存数据示匿名内存数据结结构的内容,构的内容,输输入:入: d7f6df00:print struct anon_map8)其中包含指向其中包含指向 anon_hdr 数据数据结结构的指构的指针针, ,显显示示该结该结构内容,构内容,输输入:入: d72e2248:print struct anon
16、_hdr9)在在该结该结构中可以看到匿名内存数据构中可以看到匿名内存数据结结构通构通过过 size(假(假设为设为 80)个表)个表项组项组成,表成,表项项通通过过一个数一个数组组指指针针 array_chunk 保存。察看保存。察看这这个数个数组组的内容,的内容,输输入:入: d4e4a000,80/K10) 每个表每个表项项的内容指向一个匿名内存数据的内容指向一个匿名内存数据结结构(构(anon)。因)。因为为我我们们关心的关心的缓缓冲区(冲区(8066acc)在)在这这个段(个段(8065000 起始)的第二起始)的第二页页, ,显显示示该该数数组组中第二个表中第二个表项项的内容,的内容,输输入:入:d84cddc0:print struct anon在在该结该结构中可以看到指向构中可以看到指向 swapfs v