收藏 分享(赏)

linux kernel gdb.pdf

上传人:kuailexingkong 文档编号:1603203 上传时间:2018-08-10 格式:PDF 页数:137 大小:470.20KB
下载 相关 举报
linux kernel gdb.pdf_第1页
第1页 / 共137页
linux kernel gdb.pdf_第2页
第2页 / 共137页
linux kernel gdb.pdf_第3页
第3页 / 共137页
linux kernel gdb.pdf_第4页
第4页 / 共137页
linux kernel gdb.pdf_第5页
第5页 / 共137页
点击查看更多>>
资源描述

1、Linux Kernel GDBtracepoint module(KGTP)Update in 2014-07-221目录关于本文5什么是KGTP.6快速配置和启动KGTP7需要帮助或者汇报问题.8GDB调试普通程序和KGTP的区别表.9如何使用GDB控制KGTP跟踪和调试Linux内核11在普通模式直接访问当前值.11Linux内核的内存.12trace状态变量.13GDB tracepoint14设置tracepint.15这个函数确实存在但是设置tracepoint到上面会失败如何处理?16如何设置条件tracepoint.17如何处理错误“Unsupported operator (

2、null) (52) in expression.“18actions num.19collect expr1, expr2, .20teval expr1, expr2, 21while-stepping n.22启动和停止tracepoint23Enable 和disable tracepoint24用tfind选择trace帧缓存里面的条目25如何处理错误“No such file or directory.“ 或者“没有那个文件或目录.“26保存trace帧信息到一个文件中.27显示和存储tracepoint28删除tracepoint.29用tracepoint从内核中某点取得寄存器

3、信息.30用tracepoint从内核中某点取得变量的值32显示当前这一条trace缓存里存储的所有信息33取得tracepoint 的状态.34设置trace缓存为循环缓存.35GDB断开的时候不要停止tracepoint.36kprobes-optimization和tracepoint的执行速度37如何使用trace状态变量38普通trace状态变量39Per_cpu trace状态变量41如何定义.42本地CPU变量42CPU id变量.42例子143例子244特殊trace 状态变量$current_task,$current_task_pid,$current_thread_inf

4、o,$cpu_id,$dump_stack,$printk_level,$printk_format,$printk_tmp,$clock,$hardirq_count,$softirq_count 和$irq_count45特殊trace 状态变量$self_trace47用$kret trace函数的 .482用$ignore_error 和$last_errno tstart的错误49使用$cooked_clock 和$cooked_rdtsc 取得不 KGTP 行时 的时 信息50使用$xtime_sec 和$xtime_nsec 取得timespec51如何backtrace (st

5、ack dump).52通 $bt 用GDB backtrace 行 53用$_ret 取得当前函数的调用函数的 .56用$dump_stack 到printk里.58如何 tracepoint直接 信息59collect为直接 数 .59如何用watch tracepoint控制 件断点 录内存访问.61watch tracepoint的trace状态变量62态watch tracepoint.65动态watch tracepoint.66使用while-stepping Linux内核 67如何使用while-stepping67while-stepping的traceframe.68如何

6、显示 的变量值.70的GCC70通 汇currency1取得访问 变量的“.71如何取得函数fi的函数74如fl函数没有 .74如fl函数 75/sys/kernel/debug/gtpframe和调试76如何使用/sys/kernel/debug/gtpframe_pipe78用GDB 帧信息78用cat 帧信息.79用getframe 帧信息.80使用$pipe_trace.81和用程序一使用KGTP82GDB为访问用程序 接KGTP82直接 用程序的内存.83Trace用程序84在tracepoint 调用的从内核到用的的 信息(”用 backtrace)86如何使用add-ons/ho

7、tcode.py89如何用C的 件90API.91例子.93如何使用94如何使用 数器95定义一个perf event trace状态变量.96定义一个per_cpu perf event trace状态变量.97perf event的和配置.98用$p_pe_en开和关一个CPU上所有的perf event100用 帮助设置和取得perf event trace状态变量的GDB本.101录A 使用KGTP前的 104Linux内核.104如fl的内核是 的.104如fl是Android内核.1053如fl的内核是行 的.106Ubuntu.106Linux内核调试 的 “106Linux内核

8、调试 的 “106内核 文件 107内核 107“107“107Fedora108Linux内核调试 108Linux内核开 .108109确定Linux内核调试 是 确的.110当前Linux内核调试 在 .111使用/proc/kallsyms112使用linux_banner.113处理Linux内核调试 地信息和Linux内核执行时不 的问题114取得KGTP.115通 http KGTP.115通 git KGTP.116.117配置KGTP.118KGTP.119普通119错误处理120用一 特殊选 KGTP.121和 KGTP.122和DKMS一使用KGTP.123使用KGTP

9、Linux内核patch124”和KGTP一使用的GDB.125录B 如何 GDB接KGTP126普通Linux.126KGTP模126处理不到“/sys/kernel/debug/gtp“的问题127GDB接到KGTP128Linux内核调试 到GDB128GDB在本地 上129如flGDB在 程 上.130Android131KGTP模132处理不到“/sys/kernel/debug/gtp“的问题133GDB接KGTP.134录C 模的 信息到GDB135如何使用getmod.136如何使用getmod.py1374关于本文http:/teawater.github.io/kgtp/k

10、gtpcn.html 是HTML 式的本文 本 https:/ 是PDF 式的本文 本 https:/ 是PDF 式的本文 本 5什么是KGTPKGTP是一个 在 上实时 Linux内核和 用程序( Android)问题的面动态跟踪器 使用KGTP 不需要在Linux内核上PATCH或者 ,要KGTP模 insmod ” Linux内核 一个 程GDB调试接 ,于是在本地或者 程的 上的GDB”在不需要停止内核的情况用GDB tracepoint 和 一 功 调试 和跟踪 Linux内核和 用程序 即使板子上没有GDB 且 没有”用的 程接 ,KGTP也”用调试的功 调试内核(见/sys/ke

11、rnel/debug/gtpframe 和调试) http:/ 或者http:/ 是介绍KGTP的英文 视频 http:/ 是介绍KGTP的中文视频 KGTP 支持X86-32 ,X86-64 ,MIPS 和ARM KGTP支持大部 本的Linux 内核(从2.6.18 到 ) 请到UPDATE 去看KGTP的更 信息 6快速配置和启动KGTP#kgtp.py将在本 上 动配置和启动KGTP和GDB # 一次使用这个本需要等一段时 因为有一 需要 wget https:/ sudo python kgtp.py # 访问内核的内存 (gdb) p jiffies_64 $2 = 5081634

12、360 #在函数vfs_read上设置trace点 这个函数的backtrace 信息 (gdb) trace vfs_read Tracepoint 1 at 0xffffffff811b8c70: file fs/read_write.c, line 382. (gdb) actions Enter actions for tracepoint 1, one per line. End with a line saying just “end“. collect $bt end (gdb) tstart (gdb) tstop (gdb) tfind Found trace frame 0

13、, tracepoint 1 #0 vfs_read (file=fileentry=0xffff88022017b000, buf=bufentry=0x7fff0fdd80f0 , count=countentry=16, pos=posentry=0xffff8800626aff50) at fs/read_write.c:382 382 (gdb) bt #0 vfs_read (file=fileentry=0xffff88022017b000, buf=bufentry=0x7fff0fdd80f0 , count=countentry=16, pos=posentry=0xfff

14、f8800626aff50) at fs/read_write.c:382 #1 0xffffffff811b9819 in SYSC_read (count=16, buf=0x7fff0fdd80f0 , fd=) at fs/read_write.c:506如fl要在 程 或者和Android一使用KGTP,请阅 录 A 使用 KGTP 前的 和录 B 如何 GDB 接 KGTP 7需要帮助或者汇报问题请把问题到https:/ 或者信到mailto: ?Subject= 汇报一个 KGTP 的问题 或者汇报到QQ群317654748 KGTP小组将尽力帮助 请到https:/ 访问旧问

15、题列表 8GDB调试普通程序和KGTP的区别表这个表是给在使用 GDB调试程序的人 的, ”帮助理解和 住KGTP的功 功 GDB调试普通程序 GDB控制KGTP调试Linux内核 里 GDB 程序用“-g“选 快速配置和启动 KGTPAttach 使用 “gdb -p pid“或者GDB “attach pid“”attach中的某个程序.Breakpoints GDB “b place_will_stop“, 程序在执行这个 执行,则程序将停止在设置这个断点的地“ KGTP不支持断点但是支持tracepoint Tracepoints” 看一种特殊的断点 ”设置在Linux kernel中

16、的一地“然 定义一 到它的action中 当tracepoint开始的时候, 们将会在内核执行到这 地“的时候执行这 当tracepoint停止的时候,” 断点停止程序 的那样用GDB tracepoint得到的数 区别是断点会停止程序但是KGTP中的tracepoint 不会 请到GDB tracepoint 看如何使用它 Memory GDB停止程序 (也许不需要),它”用GDB “print“或者“x“等 用程序的内存 ”在tracepoint中设置特殊的action 内存到trace frame中,在tracepoint停止取得 们的值 collect expr1, expr2, .

17、用tfind 选择 trace 帧缓存里面的条目 或者”在内核或者 用程序执行的时候直接们的内存 在普通模式直接访问当前值Step 和continueGDB”用 “continue“继续程序的执行,用CTRL-C停止 KGTP不会停止Linux内核,但是tracepoint”开始和停止 启动和停止 tracepoint或者用while-stepping tracepoint 录一定次数的single-stepping然 KGTP 到回放模式 这样 支持执行和“fi执行 使用 while-stepping Linux 内核 Backtrace GDB”用 “backtrace“印部调用 KGTP

18、也” 如何 backtrace (stack dump)Watchpoint GDB”用watchpoint 程序在KGTP”用watch tracepoint 录内存访问 如何用 watch tracepoint 控制 件断点 录9某 内存访问生的时候停止 内存访问调用函数 GDB”用 “call function(xx,xx)“调用程序中的函数 KGTP”用 件调用内核中的函数 如何用 C 的 件10如何使用GDB控制KGTP跟踪和调试Linux内核在普通模式直接访问当前值在GDB到KGTP上 ,如fl没有用GDB “tfind“选择一条trace帧缓存里面的条目,GDB 处于普通模式 于

19、是”直接访问内存(Linux内核或者用程序)的值和trace状态变量的值 如fl选择 一个trace帧条目,”用GDB “tfind -1“返回到普通模式 请到在普通模式直接访问当前值取得GDB “tfind“的更多信息 11Linux内核的内存例如”用面的 访问“jiffies_64“:(gdb) p jiffies_64或者”用面的 访问“static LIST_HEAD(modules)“的 一条 录:(gdb) p *(struct module *)(char *)modules-next - (size_t) “CPU0的数 :p *(struct device *)(_per_c

20、pu_offset0+(uint64_t)(&mce_device)如fl想在用一个GDB 显示多个变量,请使用面的例子:(gdb) printf “%4d %4d %4d %4d %4d %4d %18d %lun“, this_rq-cpu, this_rq-nr_running, this_rq-nr_uninterruptible, nr_active, calc_load_tasks-counter, this_rq-calc_load_active, delta, this_rq-calc_load_update2 1 0 0 0 0 673538312 71707724012tr

21、ace状态变量”使用和访问内存一样的 访问TSV 请到如何使用 trace 状态变量 取得更多TSV的信息 13GDB tracepointtracepoint 是GDB定义一 地和一 动 在tracepoint启动之 ,当Linux内核执行到那 地的时候,KGTP将执行这 动(它们中的有 会 数 存入tracepoint帧缓冲) 把它们给调试目 (KGTP) ,Linux内核将继续执行 KGTP 一 接 ” GDB或者 程序取 tracepoint帧缓冲的数 关于这 接 ,文档前面已经介绍 “/sys/kernel/debug/gtp“,将在 面介绍“/sys/kernel/debug/gt

22、pframe“ 和“/sys/kernel/debug/gtpframe_pipe“ GDB tracepoint 文档在http:/sourceware.org/gdb/current/onlinedocs/gdb/Tracepoints.html 14设置tracepinttrace 非常似break ,它的参数”是文件行,函数名或者一个地 trace将定义一个或者多个地定义一个tracepoint,KGTP将在这个点 一 动 这是一 使用trace 的例子:(gdb) trace foo.c:121 / 一个文件和行 (gdb) trace +2 / 2行 (gdb) trace my_

23、function / 函数的 一行(gdb) trace *my_function / 函数的 一个地(gdb) trace *0x2117c4 / 一个地15这个函数确实存在但是设置tracepoint到上面会失败如何处理?GCC为 高程序执行效率会inline一 static函数 因为目 文件没有inline函数的,所不 设置tracepoint在函数名上 ”用“trace 文件:行 “在 上设置断点 16如何设置条件tracepointhttp:/sourceware.org/gdb/current/onlinedocs/gdb/Tracepoint-Conditions.html和br

24、eakpoint一样,我们”设置tracepoint的触条件 且因为条件检查是在KGTP执行的,所速度比breakpoint的条件检查快很多 例如:(gdb) trace handle_irq if (irq = 47)tracepoint 1的动将在irq是47的时候才 执行 还”用GDB “condition“设置tracepoint的触条件 GDB “condition NCOND“将设置tracepoint N有条件COND为真的时候执行 例如:(gdb) trace handle_irq(gdb) condition 1 (irq = 47)GDB “info tracepoint“

25、将显示tracepoint的ID $bpnum的值是 一个GDB tracepoint的ID,所”不取得tracepoint的ID用condition 设置 设置的tracepoint的条件,例如:(gdb) trace handle_irq(gdb) condition $bpnum (irq = 47)17如何处理错误 “Unsupported operator (null) (52) in expression.“如fl使用关于字 串的条件tracepoint,在调用“tstart“的时候” 得到这个 错信息 ”转char为int 处理这个问题,例如:(gdb) p/x A$4 = 0x

26、41(gdb) condition 1 (buf0 = 0x41)18actions num这个 将设置一组action当tracepoint num触的时候执行 如fl没有设置num则将设置action到近创建的tracepoint上(因此”定义一个tracepoint然 直接 入actions 不需要参数) 然 要在 面 入action, end为 束 到目前为止,支持的action有collect,teval和while-stepping 19collect expr1, expr2, .当tracepoint触的时候, 表达式的值 这个 ”接受用逗 割的一组列表,这列表除 ”是局,局部

27、或者本地变量,还”是面的这 参数:$regs 部寄存器 $args 函数参数 $locals 部局部变量 请注意 collect 一个(collect ptr)将 collect这个的地. 在前面一个* 将会 action collectfi的数 (collect *ptr) 20teval expr1, expr2, .当tracepoint触的时候,执行定的表达式 这个 ”接受用逗 割的一组列表 表达式的 fl将 删除,所要的用是把值设置到trace 状态变量中(see 普通trace 状态变量), 不用 collect一样把这 值存到trace帧中 21while-stepping n请

28、到使用 while-stepping Linux 内核 去看如何使用它 22启动和停止tracepointtracepoint有在用面的GDB 启动 才”执行action:(gdb) tstart它”用面的 停止:(gdb) tstop23Enable 和disable tracepoint和breakpoint一样,tracepoint”使用GDB “enable“ 和“disable“ 但是请注意 它们在tracepoint停止的时候有效 24用tfind选择trace帧缓存里面的条目tracepoint停止的时候,GDB “tfind“”用 选择trace帧缓存里面的条目 当GDB在“t

29、find“模式的时候, 显示用collection 的的存在于这个条目中的数 所如fl印没有collect的数 例如函数的参数的时候,GDB将 一 错误信息 这不是bug,不用担心 如fl想选择一个条目,”再次使用 “tfind“ 还”用“tfind 条目ID“去选择某个条目 要回到普通模式(在普通模式直接访问当前值),请使用GDB “tfind -1“ 请到http:/sourceware.org/gdb/current/onlinedocs/gdb/tfind.html 取得它的详细信息 25如何处理错误 “No such file or directory.“ 或者 “没有那个文件或目录

30、.“当GDB不 到Linux 内核 的时候, 会显示这个错误信息 例如:(gdb) tfind Found trace frame 0, tracepoint 1#0 vfs_read (file=0xffff8801b6c3a500, buf=0x3f588b8 , count=8192, pos=0xffff8801eee49f48) at /build/buildd/linux-3.2.0/fs/read_write.c:365365 /build/buildd/linux-3.2.0/fs/read_write.c: 没有那个文件或目录.”用GDB “set substitute-pa

31、th“ 处理它 前面这个例子Linux内核 在“/build/buildd/test/linux-3.2.0/“但是vmlinux GDB在“/build/buildd/linux-3.2.0/“内核 啊,”处理 们:(gdb) set substitute-path /build/buildd/linux-3.2.0/ /build/buildd/test/linux-3.2.0/(gdb) tfind Found trace frame 1, tracepoint 1#0 vfs_read (file=0xffff8801c36e6400, buf=0x7fff51a8f110 , cou

32、nt=16, pos=0xffff8801761dff48) at /build/buildd/linux-3.2.0/fs/read_write.c:365365 GDB还 的 处理 问题,请到http:/sourceware.org/gdb/current/onlinedocs/gdb/Source-Path.html 取得 们的介绍 26保存trace帧信息到一个文件中/sys/kernel/debug/gtpframe是一个当KGTP停止时的tfind 式(GDB” 取它)的接 请注意 有 “cp“不 很好的处理这个问题,”用“cat /sys/kernel/debug/gtpfram

33、e ./gtpframe“拷贝它 ”在需要的时候开文件gtpframe:(gdb) target tfile ./gtpframeTracepoint 1 at 0xffffffff8114f3dc: file /home/teawater/kernel/linux-2.6/fs/readdir.c, line 24.Created tracepoint 1 for targets tracepoint 1 at 0xffffffff8114f3c0.(gdb) tfind Found trace frame 0, tracepoint 1#0 vfs_readdir (file=0xffff

34、880036e8f300, filler=0xffffffff8114f240 , buf=0xffff880001e5bf38)at /home/teawater/kernel/linux-2.6/fs/readdir.c:2424 27显示和存储tracepoint”用GDB “info tracepoints“显示所有的tracepoint ”用GDB “save tracepoints filename“保存所有的设置tracepoint的 到文件filename里 于是”在之 用GDB “source filename“设置 这 tracepoint 28删除tracepointGD

35、B “delete id“将删除tracepoint id 如fl“delete“没有参数,则删除所有tracepoint 29用tracepoint从内核中某点取得寄存器信息面是 录内核调用函数“vfs_readdir“时的寄存器信息的例子:(gdb) target remote /sys/kernel/debug/gtp(gdb) trace vfs_readdirTracepoint 1 at 0xc01a1ac0: file/home/teawater/kernel/linux-2.6/fs/readdir.c, line 23.(gdb) actionsEnter actions f

36、or tracepoint 1, one per line.End with a line saying just “end“.collect $regend(gdb) tstart(gdb) shell ls(gdb) tstop(gdb) tfindFound trace frame 0, tracepoint 1#0 0xc01a1ac1 in vfs_readdir (file=0xc5528d00, filler=0xc01a1900 ,buf=0xc0d09f90) at /home/teawater/kernel/linux-2.6/fs/readdir.c:2323 /home

37、/teawater/kernel/linux-2.6/fs/readdir.c: No such file or directory.in /home/teawater/kernel/linux-2.6/fs/readdir.c(gdb) info regeax 0xc5528d00 -984445696ecx 0xc0d09f90 -1060069488edx 0xc01a1900 -1072031488ebx 0xfffffff7 -9esp 0xc0d09f8c 0xc0d09f8cebp 0x0 0x0esi 0x8061480 134616192edi 0xc5528d00 -984445696eip 0xc01a1ac1 0xc01a1ac1 eflags 0x286 PF SF IF cs 0x60 96ss 0x8061480 134616192ds 0x7b 123es 0x7b 123fs 0x0 0gs 0x0 0(gdb) tfindFound trace frame 1, tracepoint 10xc01a1ac1 23 in /home/teawater/kernel/linux-2.6/fs/readdir.c(gdb) info regeax 0xc5528d00 -98444569630

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

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报