内核调试方法

文章目录

  • printk
  • sysrq
  • kdb/kgdb
  • TRACE_EVENT,tracepoint使用
  • 参考

printk

通过proc/sys/kernel/printk查看打印等级

$ cat /proc/sys/kernel/printk
1       4       1       3

四个数字分别对应:

console_loglevel:控制台使用的日志级别;
default_message_loglevel:调用 printk() 未指定日志级别时使用的日志级别;
minimum_console_loglevel:允许设置的控制台日志级别(console_loglevel)最小值;
default_console_loglevel:系统启动时使用的日志级别。

修改等级

# echo 1  4  1  7 > /proc/sys/kernel/printk
# cat /proc/sys/kernel/printk
1       4       1       7

如果修改不了,可以使用dmesg命令修改

pi@link:~$ sudo dmesg -n debug
pi@link:~$ cat /proc/sys/kernel/printk
8       4       1       3

sysrq

需要在内核配置才能启用

CONFIG_MAGIC_SYSRQ=y

然后在shell下使用,比如查看task

echo 1 >/proc/sys/kernel/sysrq 
echo t > /proc/sysrq-trigger

如果看不到打印,看下dmesg里是否有,调整下控制台打印等级

kdb/kgdb

这步是在编译内核之后进行的,因为有些特性需要在内核编译时就指定,比如kgdb。可以使用menuconfig把kernel debugging和KGDB选项打开,建议的配置

# CONFIG_STRICT_KERNEL_RWX is not set
# CONFIG_RANDOMIZE_BASE is not set
CONFIG_FRAME_POINTER=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB_KDB=y
CONFIG_KDB_KEYBOARD=y
CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y

使用make scripts_gdb显式编译gdb脚本
1.kdb
使用实例:

#echo g > /proc/sysrq-trigger
[255170.882750] sysrq: HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) 
#echo ttyAMA0  > /sys/module/kgdboc/parameters/kgdboc  
[255630.457371] KGDB: Registered I/O driver kgdboc
#echo g > /proc/sysrq-trigger
[255639.294716] sysrq: DEBUGEntering kdb (current=0xffff00001dba4e00, pid 10020) on processor 0 due to Keyboard Entry
[0]kdb> btc
btc: cpu status: Currently on cpu 0
Available cpus: 0-1
Stack traceback for pid 10020
0xffff00001dba4e00    10020    10019  1    0   R  0xffff00001dba5700 *sh
CPU: 0 PID: 10020 Comm: sh Tainted: P           O      5.10.0 #8
Hardware name: Netfactory soc928 EVB (DT)
Call trace:dump_backtrace+0x0/0x1b0show_stack+0x14/0x30dump_stack+0xc4/0xfc
...

常用参数

m$ 操作内存系列
go 继续运行
r$  操作寄存器系列
b$ 操作栈系列
env 查看环境变量
set 设置环境变量//比如 set LINES 10000设置行数
cpu 切换cpu
ps 查看的任务
pid 切换到任务
b$ 操作断点系列
ss 单步操作
dump$  dump信息

2.kgdb/gdb
kgdb相对于kdb来说是源码级调试器
输入kgdb,并等待命令。
可以使用串口连接,或者使用socat实现远程gdb连接kgdb,另外还有agent-proxy小工具可用。
之前尝试过这两种工具发现连上都输入不了,后来发现可能是mac上的ch340驱动有问题,直接echo “xxx”>/dev/tty.wchusbserial220,会直接卡住。但是在wsl2上尝试全部成功。
目前远程方案全部尝试失败,先使用本地
1.接入串口线,使用usbipd实现共享到wsl2
2.在host设备上提前设置好kgdboc,并进入kgdb等待连接
3.使用gdb加载vmlinux,连接串口

(gdb) set serial baud 115200
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0
warning: multi-threaded target stopped without sending a thread-id, using first non-exited thread
Remote 'g' packet reply is too long (expected 312 bytes, got 788 bytes): 00206a09c0ffffff0100000000000000000000000000000040236a09c0ffffff102a173b80ffffff102a173b80ffffff0000000000000000d8464d09c0ffffffffefffff000000004c751808c0ffffffd8464d09c0ffffff200720072007200720072007200720077fb9e509c0ffffff000000000000000077b9e589c0ffffff00000000000000000000000000000000ffffffffffffffff670000000000000000c04709c0ffffff00d04509c0ffffff03000000000000000000000000000000000000000000000018fcc308c0ffffff00000000000000000000000000000000c01eee0180ffffff80bce509c0ffffff4c751808c0ffffff80bce509c0ffffffa4741808c0ffffff0500006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

报错,查看stackoverflow,说要重编gdb,后面再弄,猜测可能需要编build,host=x86-64,target=aarch64的gdb

3.kdb/kgdb切换
$3#33 切换回kdb
$D#44+ 继续运行,退出kgdb

4.从gdb运行kdb命令
可以使用monitor help命令查看可以在gdb使用的kdb命令
5.内核启动参数
kgdboc
kgdboc_earlycon kgdb将使用bootconsole知道使用kgdboc
kgdbwait 在启动内核时等待调试器连接
kgdbcon 在gdb连接到内核时在gdb中看到printk()消息。注意,不能在系统控制台同时使用kgdboc和kgdbcon。当在系统运行时通过echo 1 > /sys/module/kgdb/parameters/kgdb_use_con配置了此功能,必须在下次i/o重配置时才能生效
kgdbreboot 更改调试器处理重新启动通知的方式
nokaslr 禁用随机化
6.同时进行调试和打印查看
可参考基于A33下linux内核的GDB+KGDB内核调试环境搭建的agent-proxy方法,或者尝试使用socat,比如linux云服务器之间利用socat进行虚拟串口通信采用一对串口的方式,或者使用socat使用网络转接
7.注意事项

在用 gdb 来调试内核的时候,由于内核在初始化的时候,会创建很多子线程。而默认 gdb
会接管所有的线程,如果你从一个线程切换到另外一个线程, gdb 会马上把原先的线程暂停。但是这样很容易导致 kernel 死掉,所以需要设置一下 gdb 。一般用 gdb 进行多线程调试,需要注意两个参数: follow-fork-mode 和detach-on-fork。

TRACE_EVENT,tracepoint使用

参考

内核通用调试方法
Development tools for the kernel
linux内核调试方法
内核调试跟踪
brendangregg的主页
linux 内核启动Initramfs与initrd 及其挂载
Ramfs, rootfs and initramfs
vscode+kgdb+qemu调试linux内核
使用gdb调试内核
关于Linux内核vmlinuz、initrd.img和System.map
关于内核镜像文件vmlinux-vmlinuz-vmlinux.bin-zimage-bzimage-uImage 之间的差异
RaspberryPi
Linux:内核调试之内核魔术键sysrq
Linux kernel:修改内核 printk 日志等级
Using kgdb, kdb and the kernel debugger internals
linux云服务器之间利用socat进行虚拟串口通信

gdb脚本报错
GNU调试器 GDB 8.3 发布及安装更新,支持RISC-V与IPv6连接等
玩转C++调试之Python的GDB库增强
GDB解coredump文件报Python异常解决办法
内核调试- vmlinux-gdb.py无法在gdb上运行

socat使用
socat网络工具

gdb报错
Remote ‘g’ packet reply is too long
Remote ‘g’ packet reply is too long问题的解决
小工具
agent-proxy小工具——用一个串口,既当控制台又当kgdb调试通道

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI in Finance 金融领域AI应用-基于DeepNLP AI App Store 真实用户评论打分和排名

AI在金融领域应用 AI in Finance 金融服务领域的AI应用和传统的金融智能应用不同。传统金融智能应用包括如风险评估 (Risk assessment), 风险管理(Risk management), 欺诈检测 (Fraud Detection)等等。 通用AI大模型和人工智能应用如ChatGPT&#xff0c…

p12初步认识c语言

1.初识c语言 什么是c语言 c语言是一门计算机语言 计算机语言是什么 人和计算机交流语言 c/c/JAVA/python 语言发展: 二进制语言 硬件-电-正电/负电 1010001010101010101010101010手册 科学家 1010100010-ADD -助记符-汇编语言 B语言 C语言 C、---高级…

设置Llinux自带的led功能,在timer模式下设置delay_on后会把delay_off给清0

记录: 内核版本4.9.88. 问题复现方法是: 1. cd /sys/class/leds/cpu //cpu是内核自带led的节点名 2. echo timer > trigger 3. echo 100 > delay_on在设置完delay_on之后,发现delay_off自己设置为0了。同理设置delay_off后&#xff…

【C++精华铺】11.STL vector模拟实现

1.序言 STL(Standard Template Library)是C的标准库之一,提供了一系列的模板类和函数,用于实现常用的数据结构和算法。其中,STL的vector是一个动态数组,可以根据需要自动调整大小。 vector可以存储任意类型…

python JSON Lines (JSONL)的保存和读取;jsonl的数据保存和读取,大模型prompt文件保存常用格式

1. JSON Lines (JSONL)文件保存 将一个包含多个字典的列表保存为 JSON Lines (JSONL) 格式的文件,每个字典对应一个 JSONL 文件中的一行。以下是如何实现这一操作的 Python 代码 import json# 定义包含字典的列表 data [{"id": 1, "name": &qu…

数据库系统安全

数据库安全威胁 数据库作为信息系统中的核心组成部分,存储和管理着大量敏感和关键的数据,成为网络攻击者的主要目标之一。以下是常见的数据库安全威胁及其详细描述: 一、常见数据库安全威胁 SQL注入攻击(SQL Injection&#xff…

37.深度学习中的梯度下降法及其实现

在深度学习的优化过程中,梯度下降法及其变体是必不可少的工具。通过对梯度下降法的理论学习,我们能够更好地理解深度学习模型的训练过程。本篇文章将介绍梯度下降的基本原理,并通过代码实现展示其具体应用。我们会从二维平面的简单梯度下降开…

使用nodejs进行截图

创建一个空文件夹 初始化项目 npm init -y下载插件 yarn add puppeteer根目录下创建app.js放入以下内容: const puppeteer require(puppeteer);(async () > {// 启动 Puppeteer 并创建一个新浏览器实例// const browser await puppeteer.launch(); // 会在…

大白话讲解AI大模型

大白话讲解大模型 大模型的发展重要大模型发展时间线 大模型的简单原理-训练⼤模型是如何训练并应⽤到场景中的?如果训练私有化模型 模型:model 语料库:用于训练模型的数据 大模型的发展 详细信息来源:DataLearner 2022年11月底…

v-bind指令——03

v-bind 指令详解&#xff1a; 1 、这个指令是干嘛的&#xff1f; 可以让html标签的某个属性的值产生动态的效果 2、v-bind指令的语法格式&#xff1a;<HTML 标签 v-bind : 参数 “表达式”> </HTML> 3、v-bind指令的编译原理&#xff1a; 编译前&#xff1a…

声音的转译者:Transformer模型在语音识别中的革命性应用

声音的转译者&#xff1a;Transformer模型在语音识别中的革命性应用 在人工智能领域&#xff0c;语音到文本转换&#xff08;Speech-to-Text&#xff0c;STT&#xff09;技术正迅速发展&#xff0c;成为连接人类语言与机器理解的桥梁。Transformer模型&#xff0c;以其卓越的处…

关于 RK3588刷镜像升级镜像”没有发现设备“ 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140287339 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

企业资产管理系统带万字文档公司资产管理系统java项目java课程设计java毕业设计

文章目录 企业资产管理系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 企业资产管理系统 一、项目演示 企业资产管理系统 二、项目介绍 语言&#xff1a;java 数…

javaweb学习day1《HTML篇》--新浪微博(前端页面的创建思路及其HTML、css代码详解)

一、前言 本篇章为javaweb的开端&#xff0c;也是第一篇综合案例&#xff0c;小编也是看着黑马程序员的视频对里面的知识点进行理解&#xff0c;然后自己找一个新浪微博网页看着做的&#xff0c;主要还是因为懒&#xff0c;不想去领黑马程序员的资料了。 小编任务javaweb和ja…

云端日历同步大师:iCloud让工作与生活井井有条

云端日历同步大师&#xff1a;iCloud让工作与生活井井有条 在快节奏的现代生活中&#xff0c;无论是工作还是个人生活&#xff0c;我们都需要一个可靠的日历应用来帮助我们管理日常事务和重要事件。iCloud作为苹果公司提供的云服务&#xff0c;其日历应用&#xff08;Apple Ca…

力扣-dfs

何为深度优先搜索算法&#xff1f; 深度优先搜索算法&#xff0c;即DFS。就是找一个点&#xff0c;往下搜索&#xff0c;搜索到尽头再折回&#xff0c;走下一个路口。 695.岛屿的最大面积 695. 岛屿的最大面积 题目 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相…

helm安装解决无授权问题

在安装kubesphere的时候需要先安装镜像管理工具helm它配合着tiller服务能方面地创建拉取地三镜像库更像一个本地的maven工具&#xff0c;安装helm可以通过脚本的方式担是容易被强&#xff0c;下载二进制的软件包解压得到helm把它移动/user/local/bin目录下&#xff0c;然后查看…

华为HCIP Datacom H12-821 卷33

1.判断题 缺省情况下&#xff0c;华为AR路由器的VRRP运行在抢占模式下 A、对 B、错 正确答案&#xff1a; A 解析&#xff1a; 无 2.判断题 一个Route-Policy下可以有多个节点&#xff0c;不同的节点号用节点号标识&#xff0c;不同节点之间的关系是"或"的关…

禁用华为小米?微软中国免费送iPhone15

微软中国将禁用华为和小米手机&#xff0c;要求员工必须使用iPhone。如果还没有iPhone&#xff0c;公司直接免费送你全新的iPhone 15&#xff01; 、 这几天在微软热度最高的话题就是这个免费发iPhone&#xff0c;很多员工&#xff0c;收到公司的通知。因为&#xff0c;登录公司…

精通Postman响应解析:正则表达式的实战应用

&#x1f9d0; 精通Postman响应解析&#xff1a;正则表达式的实战应用 在API测试和开发的世界中&#xff0c;Postman是一个强大的工具&#xff0c;它不仅可以发送请求、管理环境&#xff0c;还能使用正则表达式来解析响应。正则表达式是一种强大的文本处理工具&#xff0c;能够…