如何在Windows上配置Firebird转储收集
简而言之,共3个步骤:
-
如果您安装了带Guardian选项的Firebird,请禁用Firebird Guardian - 将其服务设置为“禁用”,并将Firebird Server从“手动”改为“自动”。
-
在firebird.conf中设置参数 BugCheckAbort=1(如有必要,请取消注释),然后重启Firebird以生效。
-
在Windows错误报告(WER)中配置并验证Firebird可执行文件的转储收集。
重要!
请确保Firebird文件夹中有包含调试信息的文件(扩展名为 *.pdb)。HQbird Enterprise发行版已包含这些文件,对于社区版Firebird,可以从Firebird下载页面下载这些文件 - 请使用带有“debug”的下载链接。
应放置以下pdb文件:
适用于Firebird 2.5.x:
fbclient.pdb、fbembed.pdb、fbserver.pdb、fb_inet_server.pdb - 放入Firebird的bin\文件夹
适用于Firebird 3.x和Firebird 4.x:
fbclient.pdb和firebird.pdb - 放入Firebird的根文件夹;
engine12.pdb(适用于3.x)和engine13.pdb(适用于4.x)- 放入plugins\文件夹
设置WER
可直接使用的reg文件
启用WER
禁用WER
以下是手动设置的详细说明:
要设置WER,请在注册表中找到以下键
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
并打开其子键。
选中“ Windows Error Reporting”,确保存在名为 Disabled 的参数,类型为REG_DWORD,其值为0。
打开它。
注意! 不要将此键与HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Error Reporting(Microsoft\后面没有Windows)混淆。
在键
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting
中创建(如果已存在则仅设置)参数:
名称:DontShowUI
类型:DWORD
值:1
然后,在已打开的键
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting
中找到子键 LocalDumps;如果不存在,则创建它。
然后打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps。
WER允许指定通用和本地(私有)设置。
通常,我们需要所有进程的转储。
为此,在子文件夹LocalDumps中创建参数:
- DumpFolder,REG_EXPAND_SZ,- 存储转储的文件夹名称。该文件夹应有足够的可用空间(如果您运行的是SuperServer或SuperClassic,约为服务器内存的2倍)。此外,用于运行需要转储的服务的账户必须具有该文件夹的权限(这就是为什么网络位置可能不是好的选择,因为Firebird使用的LocalSystem账户无权访问远程位置)。
- DumpCount,REG_DWORD,- 转储文件的最大数量(达到该数量后转储将被轮换),设置为2或更大
- DumpType,REG_DWORD,- 转储类型,必须为2。
当发生崩溃时,转储文件将创建在DumpFolder中配置的文件夹中!
有关WER设置的更多详细信息
-
https://docs.microsoft.com/en-us/windows/desktop/wer/wer-settings
-
https://docs.microsoft.com/en-us/windows/desktop/wer/collecting-user-mode-dumps
如何检查转储创建(仅在没有实际用户连接时!)
要测试转储收集,我们需要触发Firebird崩溃:下载 /download/killudf/badudf.dll.7z
解压并将badudf.dll放入UDF文件夹( 测试后别忘了删除它!),然后运行以下cmd文件
@echo off
setlocal enabledelayedexpansion enableextensions
set fbc=C:\HQBird25.in
set dbnm=%~dp0tmptest.fdb.tmp
set usr=SYSDBA
set psw=masterkey
del !dbnm! 2>nul
echo create database 'localhost:!dbnm!' user '!usr!' password '!psw!'; | "!fbc!\isql.exe" -q -z
(
echo set echo on;
echo declare external function crashme
echo returns int by value
echo entry_point 'crashme' module_name 'badudf';
echo commit;
echo show function;
echo select crashme(^) from rdb$database;
) > %~dp0tmptest.sql.tmp
"!fbc!\isql.exe" localhost:!dbnm! -q -i %~dp0tmptest.sql.tmp -user !usr! -pas !psw!
del !dbnm!
del %~dp0tmptest.sql.tmp
联系我们
如果您遇到Firebird崩溃或其他异常行为,请联系我们:[email protected]