Linux调试方法
Linux调试方法
北冥有鱼被烹
这个作者很懒,什么都没留下…
展开
-
【微记录】linux如何使用ebpf观测你的某个命令调用了内核的ioctl?(bpftrace sys_enter_ioctl)
对于工程实践中需要查看某些ioctl是否被调用,尤其是一个新的模块初次调试,在不添加调试命令debug的情况下如何观测?另外就是对于外部提供的二进制程序,如何观测该程序是否调用ioctl以及何时调用?这些都通过ebpf能够良好的观测。原创 2024-05-15 02:13:26 · 161 阅读 · 0 评论 -
gdb如何指定调试程序的参数,如何指定断点和调试?(--args、set args、break xxx、s、n)
【代码】gdb调试如何指定调试命令的参数,如何指定断点和调试?原创 2024-05-08 00:55:41 · 395 阅读 · 0 评论 -
Linux动态观测神器bpftrace的5种探针、7个常见内置变量和常见操作?
bpftrace使用 LLVM 作为后端将脚本编译为 BPF 字节码,利用 BCC(BPF Compiler Collection)与 Linux BPF 系统进行交互。原创 2024-05-08 00:26:29 · 314 阅读 · 0 评论 -
关于Linux内核调试中几个工具kprobe、ftrace、ebpf关系的简单记录(本质是预留的nop)
最近和行业大佬探讨关于Linux内核中kprobe、ftrace、ebpf关系的一些,特此记录:原创 2024-04-23 01:14:23 · 235 阅读 · 0 评论 -
编译Linux内核模块遇到/lib/modules/.../build: No such file or directory怎么办?以及kernel-devel和kernel-header作用?
那么就依赖/lib/module/uname−rbuild有相关的编译信息,比如所有的symbol等以及编译框架。libmodules(shell uname -r)/build是一个软连接,指向实际的内核源码。实际的内核源码在 /usr/src/kernels/uname−r而这个usrsrckernels(uname -r)就是kernel-devel的rpm安装后的内核信息。原创 2024-04-17 01:24:04 · 1513 阅读 · 1 评论 -
Linux的3个debug rpm包有什么区别kernel-debuginfo-common、kernel-debuginfo、kernel-debug-debuginfo?(源码、库、库)
kernel-debug-debuginfo 是debug版本linux的debuginfo库,本质是库,同kernel-debuginfo。kernel-debuginfo-common 主要是编译linux的与架构无关的,本质就是源码。yum源列出的mirror上的rpm包:(注意yum本质只是一个包管理框架,包本质都是这些rpm包)kernel-debuginfo 主要是vmlinux、所有的ko等,会copy文件到。原创 2024-04-17 00:27:58 · 384 阅读 · 0 评论 -
【1000个GDB技巧之】GDB中使用python脚本的方法以及4个注意事项(define、python、end、gdb.execute、to_string=True)
坑3:python代码必须定格严格按照table格式撰写(还有一个方法就是写成纯gdb文件然后import。坑4:gdb.execute代码中必须写to_string才能正确输出到返回值,进一步提供给gdb使用。坑2:gdb.execute执行后的输出结果包括$xxx 获取需要做转换。坑1:python和gdb的end都不值直接注释,需要另起一行。原创 2024-04-15 02:03:14 · 537 阅读 · 0 评论 -
【1000个GDB技巧之】GDB如何配置启动自动执行脚本以及.gdbinit的3种工程用法?(~/.gdbinit、source、define、end、set)
比如一些配置:以及一些常用的需要加载的。原创 2024-04-14 22:33:08 · 537 阅读 · 0 评论 -
【1000个GDB技巧之】GDB运行中如何动态更新内存的corefile?
场景 /proc/kcore包括了linux内存,但是在gdb试用中的时候,加载的可能支持某个快照。如何动态读取最新数据而不用退出重新加载,就使用GDB的core-file进行处理。站在GDB设计者的角度,面向对象的提供命令,提供core-file对于内存,提供symbol-file对于symbol。未更新前数据不会变化,更新core-file后会动态加载。原创 2024-04-14 21:42:21 · 155 阅读 · 0 评论 -
【1000个GDB技巧之】如何在远端服务器打开通过vscode动态观测Linux内核实战篇?
(也可以直接在vscode中配置,忽略)主要步骤:在~/.ssh/config中添加服务端的host,以便vscode的remote中能够登录。原创 2024-04-14 10:22:58 · 976 阅读 · 0 评论 -
GDB 快速使用调试测试 C 程序的3个步骤
所以核心是 gdb直接启动后,r执行程序 crash后使用bt查看程序所在行。更多高阶用法以后更新。原创 2024-03-16 00:40:50 · 709 阅读 · 0 评论 -
Linux调试工具之 Ftrace 使用的3个步骤记录(配置、管理、查看)
Ftrace(function trace) 是内核自带的调试工具,可以进行函数级的trace辅助定位内核问题,是 Linux 通用的调试框架。本文主要记录常用的3个步骤,我总结为:配置、管理和查看。原创 2024-03-11 01:25:04 · 1376 阅读 · 0 评论 -
【1000个GDB技巧-011】-vscode调试模式添加配置不显示cppdbg如何处理
C/C++ debug在调试窗口调试kernel 需要依赖cppdbg的type,但是初次使用通过图中添加配置看不到标注2的这几个选项。这里点击添加配置,实际上是vscode的 快捷键的 代码片段 自动补全的功能,然后其他插件注册到这个快捷输入后,点击添加配置就会自动根据输入补全需要的这些。第三步:点击运行后报错直接忽略,然后点击添加配置就能看到cppdbg类型的自动添加配置了。分析原理的来源:红色部分是我加的自定义代码片段,点击添加配置后也出现在了这里。只有微软自己开发的C/C++插件提供的才可以。原创 2023-08-05 01:28:08 · 1025 阅读 · 0 评论 -
【1000个Linux内存知识-015】Linux系统中有哪些系统全局变量可供查看(不断更新)
不断收集系统全局变量,这些全局变量使用gdb、crash、ebpf等动态监测方式能够快速查看。并且很多命令读取系统信息本质是读取变量,如果获取这些变量,也能从本质上得到系统运行状态。引用一句话:不要关注程序语言的写法,他们千奇百怪。要关注数据的流动。因为代码只是用一种形式写表达,本质是数据。原创 2023-08-13 15:03:33 · 123 阅读 · 0 评论 -
【1000个GDB技巧-008】-GDB如何设置类似shell变量方便后面程序访问?set $my_val=0x123
shell设置变量不用加$原创 2023-08-11 08:31:49 · 40 阅读 · 0 评论 -
如何不用vmlinux也能用gdb调试linux内核模块以及调试linux内核?/sys/modules/xxxko/sections add-symbole-file -s .data
ko和vmlinux通过gdb调试的原理与实战方法原创 2023-08-13 23:57:03 · 231 阅读 · 0 评论 -
【1000个GDB技巧-009】-GDB如何调用shell命令?shell echo 1 > my.gdb
gdb中使用shell命令可以快速执行一些变量获取,处理文件,读取文件,读取配置等。原创 2023-08-11 08:36:17 · 309 阅读 · 0 评论 -
【1000个GDB技巧-011】linux内核中常见的一些调试目录文件汇总记录(不断更新)
不断积累和记录,能够更灵活的运用和回忆。原创 2023-08-14 00:50:13 · 63 阅读 · 0 评论 -
【1000个GDB技巧-007】-GDB如何像C语言语法一样访问C语言数据结构和变量打印 p /x array_list[array_index + 1].country.latitude
这一个语法的支持,能够快速调试C语言,包括app、so、kernel多个维度极大的方便调试观测。本后的本质其实还是拿到对应的地址从内存地址读取数据 只是多了个结构类型判断 类似ptype。原创 2023-08-03 00:37:22 · 59 阅读 · 0 评论 -
【1000个GDB技巧-006】-GDB如何使用x内存命令打印字符串 x/s 0x12345或者 x/s g_test_symbol或者vsc中g_test_symbol,s
x命令是用来查看内存地址内容的,如果要打印字符串直接用/s 类似p功能。vsc提供的快捷智能打印 支持,s指定格式非常高效。除了命令行添加-exec执行外还可以简便写法。- 知道符号:(相当于地址)- 使用vsc独特用法。使用符号,注意指定格式。原创 2023-08-03 00:32:07 · 717 阅读 · 0 评论 -
【1000个GDB技巧-005】-GDB如何根据地址打印指定结构 *(struct xxx *)(0x12345)
注意前提是需要先add-symbol-file能够识别符号。这个功能GDB能够自动解析包括二级指针 效率神器。方法一:使用p打印,会打印到一行。方法二:使用直接打印(vsc)注意vsc不需要-exec前缀。注意vsc需要-exec前缀。原创 2023-08-03 00:22:16 · 306 阅读 · 0 评论 -
【1000个GDB技巧-004】-GDB如何执行shell命令 shell echo $PATH
技巧:可以放到vsc debug窗口查看变量。原创 2023-08-03 00:14:28 · 117 阅读 · 0 评论 -
【1000个GDB技巧-003】-GDB如何设置变量以及使用变量 set $abc;p /x $abc
或者如果是vsc放到配置文件的 setupCommands中加变量。然后set命令放到~/.gitinit 的启动脚本中。p /x $abc 按照16进制打印。注意vscode中需要加-exec。场景:可以设置一些变量地址。原创 2023-08-03 00:10:58 · 315 阅读 · 0 评论 -
手撕烂笔头-如何根据vmlinuz生成vmlinux
正常情况可以根据kernel-debuginfo的rpm包安装vmlinux到 /usr/lib/debug/lib/modules/`uname -r`/vmlinux。核心原理是根据vmlinuz生成vmlinux,然后根据vmlinux和system.map生成vmlinux。另外可以根据kernel源码中的scripts/extract-vmlinux生成vmlinux 但是需要安装/usr/src/kernels/编译源码。如果某些情况下无法安装,可以使用该工具生成。原创 2023-08-01 00:56:07 · 195 阅读 · 0 评论 -
【1000个GDB技巧-001】-gdb add-symbol-file如何添加内核模块?add-symbol-file xxx.ko 0x12 -s .data 0x67 -s .bss 0x345
asf是用来加载符号的,加载符号的时候,如果不指定文件的运行地址,就会造成取全局变量的时候,会得到一个偏移值,而不是实际的值。获取text还有一个方式就是cat /proc/modules 最后一个地址。直接加载起始地址是0 造成读取全局变量等地址仅仅是一个偏移。需要指定,代码段,数据段和bss段的加载地址。第一个参数默认是.text。原创 2023-07-18 08:37:51 · 363 阅读 · 0 评论 -
【1000个GDB技巧-002】-gdb watch窗口怎么写gdb命令
需要提前add-symbol-file 并且需要.data .text .bss。# 配置launch json 设置为cppddd。watch xxx #qeum联合。还可以不用p,打印16进制h8o,vmcore对于gdb无法持续追踪。可以查看自定义版本信息字符串。打印可以直接写符号 xxx。需要额外加-exec。原创 2023-07-19 03:07:50 · 47 阅读 · 0 评论 -
手撕烂笔头-云服务器云端如何快捷键触发sysrq
云服务器的sysrq在串口触发sysrq不是键盘的sysrq(print screen按键),而是串口输入 ~B触发。云服务器一般都是用ssh登录,sysrq无法直接使用,需要登陆到云服务器的串口服务器(通过带外)- 接下来输入sysrq的子命令 比如 h帮助 c触发crash b重启等等 (不要等太久输入)- 在串口输入 ~B (输入结束后不用按着shift。2. 不是sysrq按键而是 ~B。原创 2023-08-01 00:23:55 · 55 阅读 · 0 评论