
Linux调试方法
文章平均质量分 55
Linux调试方法
北冥的备忘录
善读者,玩索而有得焉,则终身用之,有不能尽者矣。
本博客是笔者的个人实践记录,文笔随意,严谨度一般,仅供参考,不喜勿喷
展开
-
【微知】journalctl如何指定固定时间段的日志?如何指定内核日志?如何实时监测?(journalctl --since xx --until xx; journalctl -f -k)
journalctl是在Linux系统中用于查看和管理系统日志的命令行工具。它是systemd日志系统的一部分,将来自不同来源的日志信息集中管理,包括内核日志、系统服务日志、应用程序日志等,提供一个统一的接口来查看和查询所有日志。使用一种结构化的二进制格式来存储日志,这种格式不仅紧凑,而且便于快速查询和过滤。原创 2025-04-26 19:49:11 · 201 阅读 · 0 评论 -
【微知】使用neohost持续监控网卡行为的两种方式?(--run-loop方式和watch -n 1 -d 然后输出中sed去掉特殊字符)
neohost检测网卡的重要性能指标,经常需要不停的敲,本文提供2种方式自动刷新。原创 2025-04-13 00:48:35 · 273 阅读 · 1 评论 -
【微知】PCIe网卡如何查看当前pcie是几个lane比如x4 x8还是x16?(lspci -vvv查看LnkCap和LnkSta; /sys/bus/pci/devices/*/*link*)
有些时候知道某个网卡的宣称的物理极限速率,但是实际插入到服务器上由于某些设置、物理接口限制(比如x4 x8)或者其他拓扑带来的变化,造成实际生效的速率并非理论值。此时如何得知实际的PCIe上的实际速率?原创 2025-04-12 23:43:05 · 608 阅读 · 0 评论 -
【微知】Intel芯片中的DDIO技术是什么?(Intel Data Direct I/O I/O 设备能够访问 CPU 的最后一级缓存)
从 M2IOSF 的角度来看,入站写入包括两个阶段:所有权和数据回写。在所有权阶段,M2IOSF 使用 ITOM 或 ITOMCacheNear作码向 CHA 发送所有权请求,CHA 通过将目标缓存行的所有权交给 M2IOSF 并相应地更新 snoop 过滤器来做出响应。与非 IO作一样,将缓存行的所有权授予 M2IOSF 需要通过 snoops 通知缓存行的其他所有者,以遵循 MESIF 一致性协议使其副本无效。所有权阶段结束后,M2IOSF 将数据消息 MTOI 发送到同一个 CHA。原创 2025-03-21 02:47:33 · 811 阅读 · 0 评论 -
【微知】qemu-img如何将一个现有的qcow2文件创建快照?(qemu-img snapshot -c snap.qcow2 org.qcow2; qemu-img snapshot -l xx)
qcow2文件随着运行会不断变化,如何保留某一个环境可以使用snap快照功能,几乎不增加镜像大小,并且还是保留在qcow2文件中。原创 2025-03-12 02:16:48 · 230 阅读 · 0 评论 -
【微知】如何使用qemu启动arm版本的Anolis操作系统?(-cpu cortex-a72-drive; file=./xx.qcow2; -bios ./QEMU_EFI.fd)
中途遇到多个问题(包括qemu重新编译、更换编译机、更换系统、更换版本、寻找qemu多个版本原因等)一度放弃最后还是解决。这里指定bios和qcow2的磁盘,并且用cortex-a72的cpu和虚拟的机器 指定8个核,2G内存,bios文件使用uefi,指定串口是stdio。下载操作系统的qcow2的格式,qcow2已经安装好了系统,能够直接使用;如果不是aarch64,x86也可以,只是用qemu x86的。身边如果没有ARM相关实际的硬件,但是希望跑操作系统,可以用qemu来操作。原创 2025-03-11 01:19:55 · 859 阅读 · 0 评论 -
微知-Linux内核自带的模块被压缩为ko.xz后如何恢复成不压缩版本?(xz -d xxx.ko.xz)
在使用crash定位问题的时候需要使用ko使用对应的符号信息。直接用ko.xz无法正确加载。需要恢复成ko文件。本文介绍如何解压缩。原创 2024-10-25 00:48:55 · 652 阅读 · 0 评论 -
微知SOP-定位Linux crash问题的几个常用方面和常用命令?
尤其其中的结合SP堆栈指针SP + rd + struct能够看到表面现象背后很多隐藏的数据,打开了一闪通往真相的大门,灵活运用并结合反汇编和操作系统函数调用应该算一个高阶功法了。然后用struct 获取数据:(这里因为用了内核自带的mlx的代码,没有源码,如果用OFED自己编译便能打印详细的详细的数据),下次自己编译后再处理。这里的SP是堆栈指针,堆栈是从上到下长的。周边的数据,可能找到参数,另外就是读取出来的地址有0或者1这些非0xfff等比较大的地址,就要注意,可能是突破点。说明堆栈读取的还不够。原创 2024-10-24 23:35:17 · 795 阅读 · 0 评论 -
微知-如何给某个文件打开linux内核的动态打印开关?(echo -n ‘file probe.c +p‘ > /sys/kernel/debug/dynamic_debug/control)
printk 只能支持7个等级,并且是全局统一开关。粒度太粗。如何做到动态开关某个文件的debug?linux内核提供了dynamic debug的机制(后文称dd)。本文以pci驱动中的probe.c为例子介绍 开启内核中已使用了dd模块并且并已编译到内核的模块如何直接开启打印。原创 2024-08-22 08:54:51 · 894 阅读 · 0 评论 -
【微记录】linux如何使用ebpf观测你的某个命令调用了内核的ioctl?(bpftrace sys_enter_ioctl)
对于工程实践中需要查看某些ioctl是否被调用,尤其是一个新的模块初次调试,在不添加调试命令debug的情况下如何观测?另外就是对于外部提供的二进制程序,如何观测该程序是否调用ioctl以及何时调用?这些都通过ebpf能够良好的观测。原创 2024-05-15 02:13:26 · 288 阅读 · 0 评论 -
gdb如何指定调试程序的参数,如何指定断点和调试?(--args、set args、break xxx、s、n)
【代码】gdb调试如何指定调试命令的参数,如何指定断点和调试?原创 2024-05-08 00:55:41 · 1394 阅读 · 0 评论 -
Linux动态观测神器bpftrace的5种探针、7个常见内置变量和常见操作?
bpftrace使用 LLVM 作为后端将脚本编译为 BPF 字节码,利用 BCC(BPF Compiler Collection)与 Linux BPF 系统进行交互。原创 2024-05-08 00:26:29 · 973 阅读 · 0 评论 -
关于Linux内核调试中几个工具kprobe、ftrace、ebpf关系的简单记录(本质是预留的nop)
最近和行业大佬探讨关于Linux内核中kprobe、ftrace、ebpf关系的一些,特此记录:原创 2024-04-23 01:14:23 · 480 阅读 · 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 · 5624 阅读 · 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 · 1066 阅读 · 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 · 1488 阅读 · 0 评论 -
【1000个GDB技巧之】GDB如何配置启动自动执行脚本以及.gdbinit的3种工程用法?(~/.gdbinit、source、define、end、set)
比如一些配置:以及一些常用的需要加载的。原创 2024-04-14 22:33:08 · 1229 阅读 · 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 · 218 阅读 · 0 评论 -
【1000个GDB技巧之】如何在远端服务器打开通过vscode动态观测Linux内核实战篇?
(也可以直接在vscode中配置,忽略)主要步骤:在~/.ssh/config中添加服务端的host,以便vscode的remote中能够登录。原创 2024-04-14 10:22:58 · 1105 阅读 · 0 评论 -
GDB 快速使用调试测试 C 程序的3个步骤
所以核心是 gdb直接启动后,r执行程序 crash后使用bt查看程序所在行。更多高阶用法以后更新。原创 2024-03-16 00:40:50 · 788 阅读 · 0 评论 -
Linux调试工具之 Ftrace 使用的3个步骤记录(配置、管理、查看)
Ftrace(function trace) 是内核自带的调试工具,可以进行函数级的trace辅助定位内核问题,是 Linux 通用的调试框架。本文主要记录常用的3个步骤,我总结为:配置、管理和查看。原创 2024-03-11 01:25:04 · 1585 阅读 · 0 评论 -
【1000个GDB技巧-011】-vscode调试模式添加配置不显示cppdbg如何处理
C/C++ debug在调试窗口调试kernel 需要依赖cppdbg的type,但是初次使用通过图中添加配置看不到标注2的这几个选项。这里点击添加配置,实际上是vscode的 快捷键的 代码片段 自动补全的功能,然后其他插件注册到这个快捷输入后,点击添加配置就会自动根据输入补全需要的这些。第三步:点击运行后报错直接忽略,然后点击添加配置就能看到cppdbg类型的自动添加配置了。分析原理的来源:红色部分是我加的自定义代码片段,点击添加配置后也出现在了这里。只有微软自己开发的C/C++插件提供的才可以。原创 2023-08-05 01:28:08 · 1562 阅读 · 0 评论 -
【1000个Linux内存知识-015】Linux系统中有哪些系统全局变量可供查看(不断更新)
不断收集系统全局变量,这些全局变量使用gdb、crash、ebpf等动态监测方式能够快速查看。并且很多命令读取系统信息本质是读取变量,如果获取这些变量,也能从本质上得到系统运行状态。引用一句话:不要关注程序语言的写法,他们千奇百怪。要关注数据的流动。因为代码只是用一种形式写表达,本质是数据。原创 2023-08-13 15:03:33 · 204 阅读 · 0 评论 -
【1000个GDB技巧-008】-GDB如何设置类似shell变量方便后面程序访问?set $my_val=0x123
shell设置变量不用加$原创 2023-08-11 08:31:49 · 91 阅读 · 0 评论 -
如何不用vmlinux也能用gdb调试linux内核模块以及调试linux内核?/sys/modules/xxxko/sections add-symbole-file -s .data
ko和vmlinux通过gdb调试的原理与实战方法原创 2023-08-13 23:57:03 · 394 阅读 · 0 评论 -
【1000个GDB技巧-009】-GDB如何调用shell命令?shell echo 1 > my.gdb
gdb中使用shell命令可以快速执行一些变量获取,处理文件,读取文件,读取配置等。原创 2023-08-11 08:36:17 · 461 阅读 · 0 评论 -
【1000个GDB技巧-011】linux内核中常见的一些调试目录文件汇总记录(不断更新)
不断积累和记录,能够更灵活的运用和回忆。原创 2023-08-14 00:50:13 · 106 阅读 · 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 · 114 阅读 · 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 · 982 阅读 · 0 评论 -
【1000个GDB技巧-005】-GDB如何根据地址打印指定结构 *(struct xxx *)(0x12345)
注意前提是需要先add-symbol-file能够识别符号。这个功能GDB能够自动解析包括二级指针 效率神器。方法一:使用p打印,会打印到一行。方法二:使用直接打印(vsc)注意vsc不需要-exec前缀。注意vsc需要-exec前缀。原创 2023-08-03 00:22:16 · 470 阅读 · 0 评论 -
【1000个GDB技巧-004】-GDB如何执行shell命令 shell echo $PATH
技巧:可以放到vsc debug窗口查看变量。原创 2023-08-03 00:14:28 · 176 阅读 · 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 · 407 阅读 · 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 · 382 阅读 · 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 · 757 阅读 · 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 · 84 阅读 · 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 · 105 阅读 · 0 评论