Kernel 内核 BUG_ON()和WARN_ON()

WARN_ON()

  • DEBUG_ON() 不是一个标准的 Linux 内核宏,它可能是特定内核版本或者特定内核配置中的一个宏,或者在某些内核代码中自定义的宏。
  • 一般来说,如果存在 DEBUG_ON(),它可能被用作一个调试开关,用于在调试版本中启用某些调试代码或打印调试信息。
  • DEBUG_ON() 通常不会像 BUG_ON() 那样触发内核崩溃,而是用于控制调试信息的输出。

在Kernel中追加 BUG_ON() 可以查看内核栈调用信息

例如 代码中追加如下:

 输出串口log如下:

GPT 解析结果:

这个日志包含了几个关键的信息,可以帮助分析问题:

  1. 服务启动失败

    • [ T1710] servicemanager: Tried to start aidl service SurfaceFlingerAIDL as a lazy service, but was unable to.
    • 这表明尝试作为延迟服务启动 SurfaceFlingerAIDL 时失败了。这通常发生在服务未安装或者服务配置错误的情况下。
  2. 内核警告

    • [ T1711] WARNING: CPU: 2 PID: 1711 at drivers/net/virtio_net.c:1738 virtnet_open+0x2c/0x280 [virtio_net]
    • 这是一个来自 CPU 核心2的警告,进程ID为1711,位于 drivers/net/virtio_net.c 文件的1738行。这表明在尝试打开一个网络设备时遇到了问题。
  3. 模块列表

    • 日志中列出了许多已加载的模块,例如 qca6490cnss2qrtr_mhi 等,这些模块可能与当前的警告或错误有关。
  4. 系统信息

    • [ T1711] CPU: 2 PID: 1711 Comm: ifconfig Tainted: G O ...
    • 这显示了触发警告的进程是 ifconfig,PID为1711,运行在CPU核心2上。Tainted: G O 表示内核被标记为“污染”,这通常意味着内核或模块是第三方修改过的,或者某些关键组件(如安全启动)没有按预期工作。
  5. 硬件和内核信息

    • [ T1711] Hardware name: Qualcomm Technologies, Inc. Lemans Single LA Guest Virtual Machine (DT)
    • 这表明日志来自一个名为“Lemans”的高通硬件设备,可能是一个虚拟机。
  6. 调用栈

    • 日志的最后部分显示了调用栈,这有助于确定问题发生时正在执行的代码路径。从调用栈可以看出,问题发生在 virtnet_open 函数中,随后是一系列网络相关的函数调用。
  7. 寄存器信息

    • 日志还包含了处理器寄存器的状态,这对于深入分析问题可能非常有用。

综上所述,这个日志指向了可能的网络驱动问题,特别是与 virtio_net 驱动相关的。可能需要检查网络配置、驱动兼容性或是否存在已知的驱动bug。如果是在虚拟化环境中,还需要考虑虚拟机的网络设置是否正确。此外,由于系统被标记为“污染”,可能还需要验证系统和内核的完整性。

 

在 Linux 系统中,要查看特定 PID 的进程信息,可以使用多种方法。以下是一些常用的命令:

1. **ps 命令**:
   使用 `ps` 命令可以直接查看特定 PID 的进程信息。例如:
   ```sh
   ps -p 1711 -o comm=
   ```
   这个命令会显示 PID 为 1711 的进程名称。`-o comm=` 是一个输出格式选项,用于仅显示命令名称。

2. **pstree 命令**:
   `pstree` 可以以树状图的形式显示进程,包括父子关系。你可以通过管道使用 `grep` 来过滤特定 PID:
   ```sh
   pstree -p | grep 1711
   ```
   这将显示包含 PID 1711 的进程及其在进程树中的位置。

3. **top 或 htop 命令**:
   这些工具可以实时显示系统中的进程信息。你可以通过它们的过滤功能来查找特定的 PID。在 `top` 中,你可以按 `Shift+F` 来过滤进程,然后输入 PID。在 `htop` 中,你可以直接在菜单中选择过滤进程。

4. **/proc 文件系统**:
   你可以直接查看 `/proc` 文件系统中对应 PID 的目录。例如:
   ```sh
   cat /proc/1711/status
   ```
   这个文件包含了进程的状态信息,包括进程名称、状态、父进程 ID 等。

5. **pgrep 命令**:
   如果你不确定进程名称,但知道其 PID,可以使用 `pgrep` 来查找:
   ```sh
   pgrep 1711
   ```
   这将列出所有 PID 为 1711 的进程。

请注意,你需要具有相应的权限才能查看其他用户的进程信息。如果你没有足够的权限,可能需要使用 `sudo` 来执行上述命令。此外,如果进程已经不存在,这些命令将不会返回任何信息。
 

 

BUG_ON()

  • BUG_ON() 是一个断言宏,它用于捕捉代码中的编程错误。
  • 当传递给 BUG_ON() 的条件为真时,内核会触发一个 BUG,并打印出错误信息,通常包括文件名、行号和函数名。
  • BUG_ON() 通常用于捕捉那些不应该发生的情况,比如代码中的逻辑错误或不一致的状态,它表明代码中存在严重问题。
  • 在某些架构上,BUG_ON() 可能会导致内核触发一个断断点异常(breakpoint trap),从而进入调试器或导致系统崩溃。

其中 BUG() 宏会导致内核打印出错误信息并触发崩溃。

 

参考文档:

Linux内核之BUG_ON()和WARN_ON()_linux bug()-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值