WARN_ON()
DEBUG_ON()
不是一个标准的 Linux 内核宏,它可能是特定内核版本或者特定内核配置中的一个宏,或者在某些内核代码中自定义的宏。- 一般来说,如果存在
DEBUG_ON()
,它可能被用作一个调试开关,用于在调试版本中启用某些调试代码或打印调试信息。 DEBUG_ON()
通常不会像BUG_ON()
那样触发内核崩溃,而是用于控制调试信息的输出。
在Kernel中追加 BUG_ON() 可以查看内核栈调用信息
例如 代码中追加如下:
输出串口log如下:
GPT 解析结果:
这个日志包含了几个关键的信息,可以帮助分析问题:
服务启动失败:
[ T1710] servicemanager: Tried to start aidl service SurfaceFlingerAIDL as a lazy service, but was unable to.
- 这表明尝试作为延迟服务启动
SurfaceFlingerAIDL
时失败了。这通常发生在服务未安装或者服务配置错误的情况下。内核警告:
[ 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行。这表明在尝试打开一个网络设备时遇到了问题。模块列表:
- 日志中列出了许多已加载的模块,例如
qca6490
,cnss2
,qrtr_mhi
等,这些模块可能与当前的警告或错误有关。系统信息:
[ T1711] CPU: 2 PID: 1711 Comm: ifconfig Tainted: G O ...
- 这显示了触发警告的进程是
ifconfig
,PID为1711,运行在CPU核心2上。Tainted: G O
表示内核被标记为“污染”,这通常意味着内核或模块是第三方修改过的,或者某些关键组件(如安全启动)没有按预期工作。硬件和内核信息:
[ T1711] Hardware name: Qualcomm Technologies, Inc. Lemans Single LA Guest Virtual Machine (DT)
- 这表明日志来自一个名为“Lemans”的高通硬件设备,可能是一个虚拟机。
调用栈:
- 日志的最后部分显示了调用栈,这有助于确定问题发生时正在执行的代码路径。从调用栈可以看出,问题发生在
virtnet_open
函数中,随后是一系列网络相关的函数调用。寄存器信息:
- 日志还包含了处理器寄存器的状态,这对于深入分析问题可能非常有用。
综上所述,这个日志指向了可能的网络驱动问题,特别是与
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博客