事实又一次证明,编译EXE程序时生成MAP文件是很有必要的
2011-04-08 17:45
603 查看
我一般会在给用户发新版本的同时生成MAP文件,并在自己机器上存起来备用。当系统遇见地址错误,尤其是崩溃时,MAP文件还是很有用的,让我们不致于不知所措。我通过MAP文件和错误地址已经不只一次找到出错代码。今天刚好又遇见了一个,在此记录下。
首先是程序用户那边出了错,错误主要有两个,日志输出如下:
2011-04-08 15:40:25 /600 [73][127.0.0.1:1227]用户请求出错 - X: 存取地址 00593676 违例发生在模块 'app.exe' 中. 读 在地址 00000008 里
2011-04-08 15:50:12 /600 [75][127.0.0.1:1256]用户请求出错 - X: 存取地址 005977EC 违例发生在模块 'app.exe' 中. 读 在地址 00000000 里
由于我的EXE入口地址是00401000,因此要把出错地址减去00401000:
005977EC-00401000=001967EC
00593676-00401000=00192676
故出错地址其实是:001967EC和00192676
这个程序是去年1月份编译的了,幸好我还有这个版本的MAP文件,打开来查了下这两个地址相近的值(就是用记事本打开,查找001967和001926,后面两位不精确所以不加入查找):
Line numbers for uQuerySvc(uQuerySS.pas) segment .text
339 0001:0019266D 340 0001:00192683
0001:00196780 TQuerySSS.CreateNewQuery
0001:001973E0 TQuerySSS.DoAppHint
很显然,问题一出在uQuerSS.pas的第339行附近,问题二则出在TQuerySSS.CreateNewQuery这个函数里,分别找来看了下:
一、uQuerySS.pas Line339:
for I := 0 to Count - 1 do
if TComponent(Items[I]).Name = AName then
显然这里Items[I]为空没有做检测。
二、TQuerySSS.CreateNewQuery:
function TQuerySSS.CreateNewQuery(
AName: string): TCustQuery;
begin
Result := PoolList.AcquireQuery;
with Result do
...
显然这里Result也是为空没检测。
问题找到了,接下来就容易分析处理了。
在我这个例子中,其实这是个已知并已解决的BUG,只是用户的版本太旧,换了个新版本就OK了。
首先是程序用户那边出了错,错误主要有两个,日志输出如下:
2011-04-08 15:40:25 /600 [73][127.0.0.1:1227]用户请求出错 - X: 存取地址 00593676 违例发生在模块 'app.exe' 中. 读 在地址 00000008 里
2011-04-08 15:50:12 /600 [75][127.0.0.1:1256]用户请求出错 - X: 存取地址 005977EC 违例发生在模块 'app.exe' 中. 读 在地址 00000000 里
由于我的EXE入口地址是00401000,因此要把出错地址减去00401000:
005977EC-00401000=001967EC
00593676-00401000=00192676
故出错地址其实是:001967EC和00192676
这个程序是去年1月份编译的了,幸好我还有这个版本的MAP文件,打开来查了下这两个地址相近的值(就是用记事本打开,查找001967和001926,后面两位不精确所以不加入查找):
Line numbers for uQuerySvc(uQuerySS.pas) segment .text
339 0001:0019266D 340 0001:00192683
0001:00196780 TQuerySSS.CreateNewQuery
0001:001973E0 TQuerySSS.DoAppHint
很显然,问题一出在uQuerSS.pas的第339行附近,问题二则出在TQuerySSS.CreateNewQuery这个函数里,分别找来看了下:
一、uQuerySS.pas Line339:
for I := 0 to Count - 1 do
if TComponent(Items[I]).Name = AName then
显然这里Items[I]为空没有做检测。
二、TQuerySSS.CreateNewQuery:
function TQuerySSS.CreateNewQuery(
AName: string): TCustQuery;
begin
Result := PoolList.AcquireQuery;
with Result do
...
显然这里Result也是为空没检测。
问题找到了,接下来就容易分析处理了。
在我这个例子中,其实这是个已知并已解决的BUG,只是用户的版本太旧,换了个新版本就OK了。
相关文章推荐
- 制作一个Flex AIR 程序调用 可执行程序(mxmlc.exe) 并且 生成.as文件并编译为.swf文件
- C/C++程序从编译到最终生成可执行文件的过程分析
- Java程序生成exe可执行文件
- Java程序如何生成Jar、exe及安装文件
- C/C++程序从编译到最终生成可执行文件的过程分析
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- 用exe4j将java程序生成exe可执行文件
- python程序编译成exe文件
- 编译linux内核生成的system.map文件详解
- C++文本查询程序 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- VS2013如何生成exe文件以及如何更改exe程序图标
- Java程序如何生成Jar、exe及安装文件
- 两个obj文件怎么连接生成一个exe程序
- Java程序如何生成Jar、exe及安装文件
- Qt学习笔记:如何运行Qt程序所生成的.exe文件
- jar文件生成可运行的exe程序
- Java程序如何生成Jar、exe及安装文件
- 建立工程后刚开始编译出现了“error PRJ0003 : 生成 cmd.exe 时出错”这样的错误,虽然在debug中生成了.exe文件,但是无法执行,提示找不到mfc90ud.dll。
- Java程序如何生成Jar、exe及安装文件
- 使用installanywhere打包java文件生成任何平台都可以运行的程序(如.exe)(关闭360!)