内核调试技巧--kernel panic

举个kernel-panic的例子

[ 2590.185432] Unable to handle kernel paging request at virtual address 00100110

[ 2590.192874] pgd = c0004000
[ 2590.192881] [00100110] *pgd=00000000
[ 2590.192891] Internal error: Oops: 17 [#1] PREEMPT SMP
[ 2590.192897] last sysfs file: /sys/devices/virtual/timed_output/vibrator/enable
[ 2590.192905] Modules linked in:
[ 2590.192916] CPU: 1    Tainted: G        W    (2.6.39.4-05422-g9d29c5e-dirty #96)
[ 2590.192935] PC is at handle_unpin+0x1c/0x1ac
[ 2590.192957] LR is at __mutex_lock_slowpath+0x2e8/0x324
[ 2590.192966] pc : [<c0246e7c>]    lr : [<c0522238>]    psr: 40000013
[ 2590.192971] sp : da961e88  ip : 22222222  fp : ed469c54
[ 2590.192978] r10: ed291e00  r9 : ed291fc8  r8 : da960000
[ 2590.192985] r7 : 00000000  r6 : 00100100  r5 : dfe89434  r4 : ed461a60
[ 2590.192993] r3 : da960000  r2 : da961e80  r1 : 22222222  r0 : da961e58
[ 2590.193002] Flags: nZcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
[ 2590.193011] Control: 10c5387d  Table: 2d25804a  DAC: 00000015
[ 2590.193018]
[ 2590.193020] PC: 0xc0246dfc:
[ 2590.193024] 6dfc  ebf8ee9a e1a0200d e3c23d7f e59f1044 e3c3303f e59f0040 e593200c e2822fbb
[ 2590.193040] 6e1c  eb0b65ae ea000003 1a000002 e1a00004 eb000e98 ea000000 e3a08000 e1a00008
[ 2590.193056] 6e3c  e28dd014 e8bd8ff0 c063581c c0549310 c0742e04 c06357e2 c05492fc c06355e3
[ 2590.193072] 6e5c  c0717a7c e92d40f7 e1a04000 e5900008 e1a06001 e1a07002 e2800034 eb0b6efc
[ 2590.193087] 6e7c  e5965010 e2863010 e3550000 1a00000f e1a00004 eb000533 e1a0200d e3c23d7f
[ 2590.193103] 6e9c  e59f1150 e3c3303f e59f214c e593300c e5933230 e58d6000 e2833fbb eb00b93a
[ 2590.193119] 6ebc  e5940008 e2800034 eb0b6bc1 ea000047 e5d6204b e3520001 0a000002 e59f011c
[ 2590.193135] 6edc  e3a0106a ebf80c07 f57ff05f e1932f9f e2422001 e1831f92 e3310000 1afffffa

[ 2590.193154] LR: 0xc05221b8:
[ 2590.193158] 21b8  e59f00b0 e3a010fd ebed81a9 eaffffb8 e1a0200d e1a00004 e3c26d7f e1a0100d
[ 2590.193173] 21d8  e3c6603f e1a02006 ebee1fd9 e594300c e5846014 e1530007 03a03000 05843000
[ 2590.193189] 21f8  f57ff05f e3a03000 e2844004 e5843000 f57ff04f e320f004 e121f005 e1a0100d
[ 2590.193205] 2218  e3c13d7f e3c3303f e5933000 e3130002 0a000000 ebfffd23 e1a0000d ebee206f
[ 2590.193221] 2238  e1a0200d e3c23d7f e3c3303f e5932004 e2422001 e5832004 e5933000 e3130002
[ 2590.193237] 2258  0a000000 ebfffd17 e28dd014 e8bd8ff0 c0747a48 c0963090 c06190d9 e92d4ff0
[ 2590.193253] 2278  e24dd014 e1a0100d e1a04000 e3c13d7f e3c3303f e5932004 e593600c e2822001
[ 2590.193269] 2298  e5832004 e59f2388 e5922000 e3520000 1a00000e e5933004 e3c3333f e3c330ff
[ 2590.193285]
[ 2590.193287] SP: 0xda961e08:
[ 2590.193291] 1e08  edc60000 0000000f dd894cb8 0000025a 60000013 00000001 00000003 3532205b
[ 2590.193307] 1e28  322e3938 0000040f 00000007 00100100 00000000 c0046730 da961e58 22222222
[ 2590.193323] 1e48  da961e80 da960000 ed461a60 dfe89434 00100100 00000000 da960000 ed291fc8
[ 2590.193339] 1e68  ed291e00 ed469c54 22222222 da961e88 c0522238 c0246e7c 40000013 ffffffff
[ 2590.193354] 1e88  ed461a60 00100100 00000000 dfe89420 dfe89434 ed461a60 da961f00 c024710c
[ 2590.193370] 1ea8  dfdc87a0 00000002 edc2d80c edc2d80c 00000001 dfe89420 ed469c00 c0243f78
[ 2590.193386] 1ec8  ed469c00 ed469c48 00000000 d8c6cda0 d35806c0 edc2d80c edc2d80c c003fc60
[ 2590.193402] 1ee8  c003fc60 c003e9a0 00000003 00000002 ed469c48 ed291e00 dfe89420 d8c6cda0
[ 2590.193418]
[ 2590.193420] FP: 0xed469bd4:
[ 2590.193424] 9bd4  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 2590.193439] 9bf4  00000000 00000000 00000000 ed464000 00000000 ed469c08 ed469c08 00000000
[ 2590.193455] 9c14  00000000 c07181e8 00000000 00000002 00000001 00000000 c05491d0 ed6dd404
[ 2590.193470] 9c34  ed6dd404 0fb00001 00000001 ed469a00 ed461a60 ed469c00 00000000 ed18c460
[ 2590.193486] 9c54  00000001 00000000 00000000 ed469c60 ed469c60 00000000 00000000 ed469c54
[ 2590.193501] 9c74  d8c11ca0 00000000 00000000 ed463740 ed469c00 00000001 ed18c460 00000001
[ 2590.193516] 9c94  00000000 00000000 ed469c9c ed469c9c 00000000 00000000 ed469c90 d8c11a80
[ 2590.193532] 9cb4  00000000 00000000 ed4636e0 ed469c00 00000002 ed18c460 00000001 00000000
[ 2590.193548]
[ 2590.193550] R0: 0xda961dd8:
[ 2590.193554] 1dd8  c0747a54 c0747a54 da961df4 c05216fc 00000060 00000001 00000001 c00838c8
[ 2590.193569] 1df8  22222222 c0747a54 a92fb7e9 00000143 edc60000 0000000f dd894cb8 0000025a
[ 2590.193585] 1e18  60000013 00000001 00000003 3532205b 322e3938 0000040f 00000007 00100100
[ 2590.193600] 1e38  00000000 c0046730 da961e58 22222222 da961e80 da960000 ed461a60 dfe89434
[ 2590.193616] 1e58  00100100 00000000 da960000 ed291fc8 ed291e00 ed469c54 22222222 da961e88

[ 2590.193632] 1e78  c0522238 c0246e7c 40000013 ffffffff ed461a60 00100100 00000000 dfe89420

[ 2590.193647] 1e98  dfe89434 ed461a60 da961f00 c024710c dfdc87a0 00000002 edc2d80c edc2d80c

............................


[ 2590.194777] [<c0246e7c>] ( handle_unpin+0x1c/0x1ac) from [<c024710c>] (nvmap_unpin+0x84/0xbc)
[ 2590.194793] [<c024710c>] (nvmap_unpin+0x84/0xbc) from [<c0243f78>] (tegra_dc_ext_flip_worker+0x33c/0x39c)
[ 2590.194822] [<c0243f78>] (tegra_dc_ext_flip_worker+0x33c/0x39c) from [<c0094b98>] (process_one_work+0x254/0x3b0)
[ 2590.194840] [<c0094b98>] (process_one_work+0x254/0x3b0) from [<c00950d8>] (worker_thread+0x228/0x3e8)
[ 2590.194861] [<c00950d8>] (worker_thread+0x228/0x3e8) from [<c009aa84>] (kthread+0x80/0x88)
[ 2590.194884] [<c009aa84>] (kthread+0x80/0x88) from [<c0047698>] (kernel_thread_exit+0x0/0x8)
[ 2590.194898] Code: e1a06001 e1a07002 e2800034 eb0b6efc (e5965010)



当pc在handle_unpin+0x1c的时候,往下运行出现了严重的错误,所以就出现了panic。


1.利用arm-linux-gnueabi-objdump -D vmlinux > kernel_dump.txt 查看handle_unpin+0x1c位置的汇编代码。

2.要么利用 arm-linux-gnueabi-gdb vmlinux

(gdb) l *handle_unpin+0x1c
0xc0246e7c is in handle_unpin (/home/*****/nvmap.c:99).
94            struct nvmap_handle *h, int free_vm)
95    {
96        int ret = 0;
97        nvmap_mru_lock(client->share);
98    
99        if (atomic_read(&h->pin) == 0) {
100            nvmap_err(client, "%s unpinning unpinned handle %p\n",
101                  current->group_leader->comm, h);
102            nvmap_mru_unlock(client->share);
103            return 0;

gdb都精确的定位到第99行了。

根据Unable to handle kernel paging request at virtual address 00100110


handle_unpin函数中的h指针为错误指针。剩下的精力就是放在什么时候,在什么地方这个值被修改了,为什么被修改了。



<think>好的,用户问的是“kernel die流程是什么”。首先,我需要确认用户指的是操作系统内核中的“die”流程。通常,在Linux内核开发中,当遇到无法恢复的错误时,内核会触发panic或oops,但“die”可能指的是更底层的处理流程。 接下来,我应该回顾一下内核错误处理的基本机制。当内核遇到严重错误,比如空指针解引用、内存访问越界等,会调用die()函数。这个函数负责处理当前的异常情况,打印相关的调试信息,比如寄存器状态、堆栈跟踪等,然后可能触发panic导致系统重启。 需要进一步分解die流程的具体步骤。首先,die()函数属于异常处理的一部分,通常在arch目录下的特定架构代码中实现,比如x86的die处理。它会先获取当前的异常信息,然后通过notifier链通知其他子系统,记录错误信息到控制台和日志,最后决定是否继续运行还是panic。 用户可能是在调试内核崩溃的问题,或者对内核的错误处理机制感兴趣。他们可能希望了解当系统发生严重错误时,内核是如何记录信息并采取行动的。因此,需要详细说明die流程的各个阶段,以及相关的函数调用,比如notifier_call_chain、oops_enter/exit等。 另外,要区分die()和panic()的区别。die()处理当前的异常,可能让内核继续运行,而panic()会导致系统停止。需要明确两者在流程中的关系,比如die()可能最终调用panic()。 还要考虑用户可能的背景,是否是内核开发者或系统管理员,他们可能需要了解如何分析内核日志中的die信息,或者如何配置内核以捕获更多调试信息。因此,在解释流程时,可以提到如何利用这些信息进行故障排查。 最后,确保使用正确的中文术语,避免直译造成的歧义。例如,将“stack trace”翻译为“堆栈跟踪”或“调用栈追踪”。同时,结构要清晰,分步骤解释流程,便于用户理解。</think>内核中的 "die" 流程是指当内核遇到无法处理的严重错误时,触发异常处理并生成崩溃信息的完整过程(通常对应 `die()` 函数)。以下是典型处理流程: --- ### **核心处理阶段** 1. **异常触发** - CPU 捕获非法操作(如空指针解引用、内存越界、除零错误) - 硬件生成异常信号(如x86的#GP、#PF异常) 2. **进入die()函数** - 内核调用 `die(const char *str, struct pt_regs *regs, long err)` - 参数包含错误描述字符串、寄存器状态和错误码 3. **关键信息收集** ```c /* 伪代码示例 */ void die(const char *str, struct pt_regs *regs, long err) { oops_enter(); // 进入oops处理 console_verbose(); // 强制控制台输出 __show_regs(regs); // 打印寄存器状态 add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE); // 标记内核污染状态 bust_spinlocks(1); // 解除自旋锁防止死锁 ``` - 打印堆栈跟踪(`dump_stack()`) - 输出内存映射信息(`show_mem()`) 4. **通知链处理** - 通过 `notify_die(DIE_OOPS, str, regs, err, 0, 0)` 调用注册的notifier函数 - 允许调试工具(如kdump)介入 5. **最终处理决策** ```c if (panic_on_oops) panic("Fatal exception"); // 触发内核恐慌 bust_spinlocks(0); oops_exit(); ``` - 根据 `panic_on_oops` 配置决定是否立即panic - 可能尝试杀死当前进程继续运行(非致命错误时) --- ### **关联机制** - **与panic()的关系** die() 可能最终调用 panic(),但更侧重于错误现场记录,而 panic() 是系统级崩溃处理 - **信息输出渠道** - 控制台输出(`printk` 缓冲区) - `dmesg` 日志记录 - 通过kmsg_dump保存到持久存储 - **架构相关实现** x86处理入口:`arch/x86/kernel/dumpstack.c` ARM处理入口:`arch/arm/kernel/traps.c` --- ### **典型日志特征** ``` [ 1234.567890] BUG: unable to handle kernel NULL pointer dereference at 0000000000000050 [ 1234.567893] IP: [<ffffffff81234567>] do_something+0x123/0x456 [ 1234.567896] PGD 1234567 PUD 1234567 [ 1234.567898] Oops: 0000 [#1] SMP [ 1234.567900] CPU: 3 PID: 4567 Comm: process_name Tainted: G W OE 4.19.0-xx-generic [ 1234.567902] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996)... [ 1234.567905] RIP: 0010:[<ffffffff81234567>] [<ffffffff81234567>] do_something+0x123/0x456 [ 1234.567908] RSP: 0018:ffffc9000123ffd8 EFLAGS: 00010246 [ 1234.567910] RAX: 0000000000000000 RBX: ffff888123456789 RCX: 0000000000000001 ...(寄存器完整输出)... [ 1234.567923] Call Trace: [ 1234.567926] [<ffffffff8123abcd>] higher_function+0xef/0x234 [ 1234.567929] [<ffffffff8123def0>] syscall_handler+0x67/0x89 ...(调用栈追踪)... ``` --- ### **调试建议** 1. 检查 `dmesg` 输出完整日志 2. 使用 `objdump` 或 `addr2line` 解析地址信息 3. 配置 `CONFIG_DEBUG_INFO` 编译内核以获取符号详细信息 4. 通过 `crash` 工具分析vmcore文件(配合kdump使用) 该流程是内核稳定性的最后防线,开发者需要通过其输出信息定位根本原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值