求助紧急问题:EAccessViolation错误如何解决?(100)

  • 主题发起人 主题发起人 planetstar
  • 开始时间 开始时间
P

planetstar

Unregistered / Unconfirmed
GUEST, unregistred user!
报错信息如下: Project WipProfile.exe raised exception class EAccessVilation with mesage 'Access violation at address 4DB07823 in module 'midas.dll'.Read of address 01A215C4. Process stopped. Use step or Run to continue. 很紧急,调试了两天都没有搞定,请大家帮忙,谢谢!
 
你这是个MIDAS三层的软件,软件发布时候必须安装包里面带上midas.dll文件,这个文件必须在你程序所能找得到的位置,否则可能运行期前台程序会出错。如果你带了midas.dll文件还出错,那么看看这个dll是否注册?没有则执行命令Regsvr32 midas.dll进行注册,如果注册了还出错,那么可能是你程序的问题了,可以跟踪4DB07823这个出错地址,从而找到异常出在源码哪一行,具体方法我给你转个帖子:如何调试delphi的Access violation at address错误——急急急========================================================================我做的一个程序,运行时偶尔发生Access violation at address这一类的错误。但只是偶尔发生,所以无法通过单步调试找到错误位置。但是,delphi中的所有对象都有地址嘛,所以我希望能够根据错误信息中的地址,在程序中找到相关的对象,然后再研究对象的使用,看看是否存在问题请问哪位大侠能够提供相关的方法,能够找到该错误地址对应的对象。如:Access violation at address 00401FEF in module 'VT1.exe'. Read of address 01C90F54中,中的00401fef,01c90f54对应的对象======================================================================== 回复人:qi7(与其临渊羡渔 不如退而结网) 02-14-2007 ? 不知道能不能帮到你1.什么是 MAP 文件?简单地讲,MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。2.DELPHI下生成MAP文件的方法: 偶只知道下面两种,如果谁知道其他的方法,敬请告知,多谢! 生成详细的MAP信息的方法: 1). project -> options -> Linker -> Map file 选择detailed. 2). D:/Fred/Code/DELPHI/MyPas/ErrLineByAddr2>dcc32 -GD project1.dpr 3.示例我们的代码为: unit Unit1; //{$D+,L+} interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var I, J: Integer; p: PChar; begin I := 10; J := 0; //I := I div J; // 32 //ShowMessage(IntToStr(I)); p := nil; p^ := 'A'; // 38 end; end. // 想必大家看到了,会有返回0地址错误....我们这里就是要让它崩溃,让我让你崩溃 ^_^ 然后执行,点击,然后出错,我的机器上,崩溃地址为 00 44 d9 46。 如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算: 崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000 0044d946 - 00400000 = 0004d946 - 00001000 = 0004c946 <= 后面列出的 0004C946 就是它了。 我们用ultraedit32之类的工具打开 .map文件,搜索 0004C94,找到了,然后就找 <= 0004c946的那个地址,然后看到了: Line numbers for Unit1(Unit1.pas) segment .text 37 0001:0004C944 38 0001:0004C946 39 0001:0004C949 41 0001:0004C97C 38 0001:0004C946 就是它了。。。unit1.pas的第38行!!去代码里看一下,果然就是38行 ^_^..... 4.补充如果由地址查不到代码行,则将 Project -> Options -> Compiler 中的 Debugging 的 Use Debug DCUs 勾选上后编译,则将调用的系统文件均编译到执行文件中,同时记录在Map文件中.这时在查找地址,不信找不到;引用http://ta.uuzone.com/app/trackBack.do?type=blog&trackBackID=6061
 
谢谢答复! DM1.QueryBodyMSR.Close ; DM1.QueryBodyMSR.CommandText :=SQL; DM1.QueryBodyMSR.Open ;//单步调试到这里的时候出错QueryBodyMSR是ClientDataSet
 
重装delphi,或者在其它机器测试是否可以正常运行。另外,检查你机器上有几个midas.dll文件,最好只有一个,如果有多个,看看文件是否都相同。
 
重装delphi也不管用,我把注册表中注册的midas.dll删除后重新注册也不管用。
 
安一个 EurekaLog EurekaLog 能显示,记录错误所在行
 
QueryBodyMSR的结果集会给DBChart的series的数据源,最初程序是没有问题的,但是users要求在chart中添加其他的数据,共8列,于是我修改了sql,并将新的datasource给DBChart的series,就出现了上面的错误。我今天没有同时把8列添加,而是逐个添加,当加到第5个的时候发生了上述错误。我今天和users协商只添加了4组数据,并release了。
 
我怀疑是不是DBChart对series的数目有限制?
 

Similar threads

I
回复
0
查看
948
import
I
I
回复
0
查看
1K
import
I
I
回复
0
查看
3K
import
I
I
回复
0
查看
3K
import
I
I
回复
0
查看
2K
import
I
后退
顶部