关于“程序闪退,没有生成DUMP文件”的一点总结

本文总结了程序在运行时闪退且未生成DUMP文件的情况。通过研究发现,SetUnhandledExceptionFilter无法捕获某些CRT函数的异常。通过在Main函数中添加特定代码,可以解决DUMP文件未生成的问题。然而,直接使用某博主的代码会导致程序死掉,正确做法是了解并应用SetUnhandledExceptionFilter函数的屏蔽原理。经过调整,现在程序在遇到异常时能成功生成DUMP文件。

今早一回到公司,测试的同事就反映,昨晚程序运行一段时间后闪退了。。。。闪退???额,好吧,幸好我有加写DUMP的代码,示例如下:

LONG WINAPI UnhandledExceptionFunction(_EXCEPTION_POINTERS* pExceptionInfo)
{
    SYSTEMTIME st;
    GetLocalTime(&st);

    CString time_now = _T("");
    time_now.Format(_T("%04d_%02d_%02d_%02d_%02d_%03d.dmp"), st.wYear, st.wMonth, st.wDay,
        st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
    CString dump_file_path = GetRootPath();            //获取程序所在的文件夹的路径
    dump_file_path += _T("dump/");
    CreateDirectory(dump_file_path, NULL);
    dump_file_path += time_now;

    HANDLE hDumpFile = CreateFile(dump_file_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
    dumpInfo.ExceptionPointers = pExceptionInfo;
    dumpInfo.ThreadId = GetCurrentThreadId();
    dumpInfo.ClientPointers = TRUE;

    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDump
### 被限制为2G的原因 在Linux系统中,coredump文件大小被限制通常是出于系统资源管理和安全方面的考虑。从系统资源管理角度来看,无限制地生成大尺寸的coredump文件可能会迅速耗尽磁盘空间,影响系统的正常运行。例如,一些大型数据库程序崩溃时可能会产生数GB甚至更大的coredump文件,如果不加以限制,会导致磁盘空间被大量占用,影响其他服务的正常使用。从安全角度考虑,coredump文件可能包含敏感信息,如用户密码、数据库密钥等,限制其大小可以在一定程度上减少敏感信息泄露的风险。此外,系统默认的资源限制设置也是导致coredump文件大小被限制的一个因素,系统管理员为了保证系统的稳定性和安全性,通常会设置一个合理的文件大小上限。 ### 解除限制的方法 #### 临时修改 可以使用`ulimit`命令来临时修改coredump文件的大小限制。以下是具体的操作步骤: ```bash # 查看当前coredump文件大小限制 ulimit -c # 设置coredump文件大小无限制 ulimit -c unlimited ``` 执行上述命令后,本次登录会话中生成的coredump文件大小将不再受限。但这种修改方式只对当前登录会话有效,当用户退出登录或系统重启后,限制会恢复到原来的设置。 #### 永久修改 要永久修改coredump文件大小限制,可以通过修改系统配置文件来实现。一般可以编辑`/etc/security/limits.conf`文件,在文件中添加或修改以下内容: ```plaintext # 对所有用户设置coredump文件大小无限制 * hard core unlimited * soft core unlimited ``` 上述配置表示对所有用户(`*`)设置硬限制(`hard`)和软限制(`soft`)为无限制(`unlimited`)。软限制是系统建议的限制,而硬限制是系统强制的最大限制。修改完成后,保存文件并重启系统,使配置生效。 另外,还可以通过修改`/etc/sysctl.conf`文件来进一步调整内核参数。在文件中添加或修改以下内容: ```plaintext # 设置内核允许的最大核心文件大小为无限制 fs.suid_dumpable = 2 kernel.core_pattern = /var/crash/core-%e.%p.%h.%t ``` `fs.suid_dumpable`参数设置为2表示允许所有进程生成coredump文件,`kernel.core_pattern`参数指定了coredump文件的保存路径和命名规则。修改完成后,执行以下命令使配置生效: ```bash sysctl -p ```
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值