<Linux> Kernel Log

本文详细解析了 Linux 内核 printk 函数的日志级别设置方法及应用,包括配置 CONFIG_DEFAULT_MESSAGE_LOGLEVEL 的方式,通过 /proc/sys/kernel/printk 动态调整日志输出等级,以及如何在 printk 调用中指定不同的 log level。

Kernel Log, 可找到定义, 

kernel/printk.c:


/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL

/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */

int console_printk[4] = {
	DEFAULT_CONSOLE_LOGLEVEL,	/* console_loglevel */
	DEFAULT_MESSAGE_LOGLEVEL,	/* default_message_loglevel */
	MINIMUM_CONSOLE_LOGLEVEL,	/* minimum_console_loglevel */
	DEFAULT_CONSOLE_LOGLEVEL,	/* default_console_loglevel */
};

include/linux/kern_level.h:

#define KERN_EMERG	KERN_SOH "0"	/* system is unusable */
#define KERN_ALERT	KERN_SOH "1"	/* action must be taken immediately */
#define KERN_CRIT	KERN_SOH "2"	/* critical conditions */
#define KERN_ERR	KERN_SOH "3"	/* error conditions */
#define KERN_WARNING	KERN_SOH "4"	/* warning conditions */
#define KERN_NOTICE	KERN_SOH "5"	/* normal but significant condition */
#define KERN_INFO	KERN_SOH "6"	/* informational */
#define KERN_DEBUG	KERN_SOH "7"	/* debug-level messages */


(1) config
在.config中定义 CONFIG_DEFAULT_MESSAGE_LOGLEVEL(0-7)

(2) debug

# cat /proc/sys/kernel/printk

7       4       1      7

-> 对应上面console_printk数组中的值

#echo 8 > /proc/sys/kernel/printk

-> 显示所有LOG, 即高于KERN_DEBUG的.

(3) printk log添加LOGLEVEL

printk(KERN_INFO "...")

printk(KERN_DEBUG "...")


<think>我们正在处理一个 .NET 应用程序崩溃的问题,具体是 `System.IO.DirectoryNotFoundException`。根据事件日志,应用程序 `CCTS.exe` 在启动时尝试加载图标文件 `C:\work\C#\Tecumseh\CCTS\CCTS.ico` 失败,导致未处理的异常,进程终止。 ### 问题原因分析 1. **绝对路径依赖**:应用程序在代码中使用了硬编码的绝对路径(`C:\work\C#\Tecumseh\CCTS\CCTS.ico`)。当应用程序部署到其他计算机时,该路径不存在。 2. **文件未部署**:图标文件可能没有随应用程序一起发布到目标计算机。 3. **路径中的特殊字符**:路径中包含 `#` 字符,在某些情况下可能导致路径解析问题(尽管在Windows中通常允许,但最好避免)。 4. **工作目录变化**:应用程序可能没有在预期的目录中运行,导致相对路径解析失败(如果使用了相对路径)。 ### 解决方案 #### 1. 使用相对路径或应用程序目录 修改代码,使用相对路径或动态获取应用程序基目录来构建图标路径。 **修改 `MainForm.Designer.cs` 文件中的代码:** ```csharp // 原始代码(问题所在): this.Icon = new System.Drawing.Icon("C:\\work\\C#\\Tecumseh\\CCTS\\CCTS.ico"); // 修改为: string iconPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CCTS.ico"); if (File.Exists(iconPath)) { this.Icon = new System.Drawing.Icon(iconPath); } else { // 可选:使用默认图标或显示错误 this.Icon = SystemIcons.Application; // 使用系统默认应用程序图标 } ``` #### 2. 确保图标文件包含在发布中 在项目文件中(`.csproj`)确保图标文件被复制到输出目录: ```xml <ItemGroup> <Content Include="CCTS.ico"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> ``` #### 3. 处理单文件发布 如果使用单文件发布(.NET 5+),资源文件默认会被打包到单文件中,运行时解压到临时目录。此时,使用 `AppDomain.CurrentDomain.BaseDirectory` 指向临时解压目录,因此图标文件会自动解压并可用。但需要确保项目配置正确: ```xml <PropertyGroup> <PublishSingleFile>true</PublishSingleFile> <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract> </PropertyGroup> ``` #### 4. 处理路径中的特殊字符 虽然 `#` 在Windows路径中允许,但为了避免潜在问题,可以重命名文件夹,移除特殊字符。或者,在代码中确保路径正确构建: ```csharp // 使用Path.Combine可以避免手动拼接路径带来的问题 string baseDir = AppDomain.CurrentDomain.BaseDirectory; string iconPath = Path.Combine(baseDir, "CCTS.ico"); ``` #### 5. 异常处理 在应用程序启动时添加全局异常处理,以便记录错误并提供友好信息: ```csharp // 在Program.cs中 static void Main() { AppDomain.CurrentDomain.UnhandledException += (sender, e) => { Exception ex = (Exception)e.ExceptionObject; File.WriteAllText("error.log", ex.ToString()); MessageBox.Show("应用程序遇到错误,请查看error.log文件。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); }; Application.Run(new MainForm()); } ``` ### 部署验证 1. 在目标计算机上,确保发布目录包含: - `CCTS.exe` - `CCTS.ico`(位于同一目录) 2. 如果使用单文件发布,则只需一个 `CCTS.exe` 文件(图标文件会被内嵌并在运行时解压)。 ### 相关问题 1. **如何确保资源文件在单文件发布中正确解压?** [.NET 单文件发布会将资源文件打包,运行时解压到临时目录。使用 `BaseDirectory` 可以访问这些文件][^3]。 2. **应用程序启动时如何设置工作目录?** [可通过快捷方式设置工作目录,或在代码中设置 `Environment.CurrentDirectory`][^1]。 3. **如何处理跨平台路径问题?** [使用 `Path.Combine` 和 `Path.DirectorySeparatorChar` 确保路径正确][^4]。 4. **如何减少因文件路径导致的部署问题?** [建议使用相对路径或资源嵌入,并彻底测试部署环境][^2]。 5. **.NET 应用程序崩溃后如何生成转储文件?** [使用 `Procdump` 工具或配置 Windows 错误报告生成转储文件以便分析][^1]。 > 通过以上步骤,应该能解决应用程序因图标文件路径问题导致的崩溃。关键是将硬编码路径改为动态获取应用程序目录,并确保资源文件正确部署。在部署到不同环境时,务必测试资源文件的加载情况。</think>### 解决 .NET 应用程序崩溃问题分析 应用程序 `CCTS.exe` 在另一台计算机上运行时崩溃,根本原因是 **`System.IO.DirectoryNotFoundException`**,具体表现为无法找到图标文件 `C:\work\C#\Tecumseh\CCTS\CCTS.ico`。这是典型的部署环境问题,与开发环境路径依赖有关。 --- ### 根本原因解析 1. **绝对路径硬编码问题** ```csharp // MainForm.Designer.cs 中的问题代码 this.Icon = new System.Drawing.Icon("C:\\work\\C#\\Tecumseh\\CCTS\\CCTS.ico"); ``` 开发环境的绝对路径 `C:\work\C#\Tecumseh\CCTS\` 在其他计算机上不存在[^1] 2. **资源文件未正确部署** - 图标文件未包含在发布包中 - 单文件发布时资源未正确解压[^3] 3. **路径特殊字符问题** 路径中的 `#` 字符可能导致解析异常(尤其在跨平台场景)[^4] 4. **工作目录不匹配** 应用程序启动时的工作目录(Environment.CurrentDirectory)与预期不符 --- ### 完整解决方案 #### 第一步:修复路径加载逻辑 修改 `MainForm.Designer.cs` 文件: ```csharp // 使用应用程序基目录构建路径 string iconPath = Path.Combine( AppDomain.CurrentDomain.BaseDirectory, "CCTS.ico" ); // 添加文件存在检查 if (File.Exists(iconPath)) { this.Icon = new System.Drawing.Icon(iconPath); } else { // 优雅降级:使用系统默认图标 this.Icon = SystemIcons.Application; // 记录警告(可选) Debug.WriteLine("警告: 应用程序图标未找到"); } ``` #### 第二步:确保资源部署 在 `.csproj` 文件中添加配置: ```xml <ItemGroup> <!-- 确保图标文件被复制到输出目录 --> <Content Include="CCTS.ico"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <!-- 单文件发布特殊处理 --> <Content Update="CCTS.ico"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <ExcludeFromSingleFile>true</ExcludeFromSingleFile> </Content> </ItemGroup> ``` #### 第三步:添加部署验证 在 `Program.cs` 中添加启动检查: ```csharp static void Main() { // 记录关键路径信息 string log = $"启动时间: {DateTime.Now}\n" + $"基目录: {AppDomain.CurrentDomain.BaseDirectory}\n" + $"图标存在: {File.Exists("CCTS.ico")}"; File.WriteAllText("startup.log", log); Application.Run(new MainForm()); } ``` #### 第四步:处理特殊字符 如果路径必须包含 `#` 等特殊字符: ```csharp // 路径规范化处理 string safePath = Path.GetFullPath(iconPath) .Replace("#", "%23"); // URL编码特殊字符 ``` --- ### 部署验证流程 1. **发布应用程序**: ```bash dotnet publish -c Release -r win-x64 --self-contained true ``` 2. **检查发布目录**: ``` bin/Release/net9.0-windows/win-x64/publish/ ├── CCTS.exe ├── CCTS.ico # 必须存在 ├── startup.log # 启动后生成 └── *.dll ``` 3. **测试不同环境**: - 无开发环境的纯净Windows - 路径包含特殊字符的目录 - 受限用户权限账户 --- ### 相关问题 1. **如何确保单文件发布时资源文件可访问?** [需配置 `<ExcludeFromSingleFile>true</ExcludeFromSingleFile>` 使资源文件保持独立][^3] 2. **应用程序启动时如何动态定位资源路径?** [推荐使用 `AppDomain.CurrentDomain.BaseDirectory` 替代硬编码路径][^1] 3. **如何处理跨平台路径差异(Windows/Linux)?** [使用 `Path.DirectorySeparatorChar` 和 `Path.Combine()` 构建跨平台兼容路径][^4] 4. **如何自动收集部署环境的错误信息?** [实现全局异常处理记录 `Environment.CurrentDirectory` 和文件系统状态][^2] 5. **权限不足导致资源访问失败如何解决?** [为应用程序运行账户添加目标目录的读取权限][^3] > 通过以上解决方案,可彻底解决应用程序因路径问题导致的崩溃。关键点是 **消除绝对路径依赖** 和 **确保资源文件正确部署**。建议在虚拟机中测试不同Windows环境以验证部署兼容性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值