DELPHI下怎样通过程序崩溃地址查找源代码的错误行(一)

DELPHI下怎样通过程序崩溃地址查找源代码的错误行(一),第1张

最近一段时间十分郁闷,公司一个新上线的项目马上要上线了,有个核心的程序在内部测试过程中没有问题,但在实际运行过程中,不知是何原因却老是出现问题,而错误信息的扑捉一直不好处理,因为问题的出现没有规律性,且每次发生的间隔多为运行1-3天时会出现,如果用DELPHI调试,一是等待周期太长,二来程序中有一些通过try方法屏蔽的部分错误 信息会不断在delphi内触发报错,由于程序是需要不断实时运行的程序,不断d出的对话框严重影响程序的运行。所以,当时只好通过记录日志方法查找问题。事实证明这个方法并不是一个理想的好方法,因为往往记录了一大堆的日志,也不知道问题出在哪里,十分头疼。

这种情况维持了很长一段时间,问题依然无法定位解决,如果能够根据报错信息直接定位到具体的delphi的源代码行就好了,说干就干,经过一晚上的努力,终于找到了一个比较简单,当然是十分适合delphi的方法。

下面将这个方法介绍给大家,以delphi7为对象:

1、先对需要分析的程序源代码重新编译,编译的同时需要获得对应的MAP文件,下面是具体的 *** 作步骤:

2) 重新编译程序,在设定生成最终执行文件的目录下你可以发现一个与执行文件同名,后缀为map的文件,这个就是我们要的map文件了。

delete不需要加Post。

删除前要判断表中是否有数据

if tb.RecordCount>0 then

tb.delete

如果数据集使用的dbexpress中的TSimpleDataSet,或者是TClientDataSet, 要提交时需要添加

tb.applyUpdates(-1)

1、Indy是个很垃圾的玩意,这个错误是Indy控件本身的问题,你自身无法解决,除非自己写API或调用OCX控件。

2、你的函数本身也有问题,Dll里的字符串不能这样传递。你看看Windows的API函数就知道,没有一个是以PChar为返回值的(字符串函数除外)。你这个程序能正常运行,真是奇迹。

3、下面这个函数是我给你改的,sURL是地址;Buffer是一个缓冲区,用来接收IP地址;BufferLength是缓冲区长度,当Buffer为 nil 时它返回需要的空间大小;函数返回值为IP地址的长度。

function getIPAddress(sURL, Buffer: PCharvar BufferLength: Longint): Longintstdcall

var

ICMP: TIdIcmpClient

R: TReplyStatus

s: string

begin

Result := 0

ICMP := TIdIcmpClient.Create(nil)

ICMP.ReceiveTimeout := 1000

ICMP.Host := sURL

ICMP.Ping

R := ICMP.ReplyStatus

s := Format('%d,', [R.MsRoundTripTime]) + R.FromIpAddress

if Buffer = nil then

BufferLength := Length(s) + 1

else begin

StrLCopy(Buffer, PChar(s), BufferLength - 1)

Result := StrLen(Buffer)

end

ICMP.free

end

4、在主程序中,这个函数这样调用

var

len: Longint

buf: PChar

begin

getIPAddress(sURL, nil, len)

GetMem(buf, len)

getIPAddress(sURL, buf, len)

ShowMessage(buf)

FreeMem(buf)

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12089298.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存