多线程排错。。。请高手!!!! (100分)

  • 主题发起人 主题发起人 Oldtiger
  • 开始时间 开始时间
O

Oldtiger

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序总是莫名其妙的出错,出错的信息为:
"0x1000caa0"指令引用的"0x100ad3a4"内存。该内存不能为"read"
可是我查遍了我的map,总找不到那个地址的指令,到底我错在那了呢?高手们帮帮忙呀!
以下是我的Map文件:
根据creation-zy的意见,我今天把这个Map删掉了
有意帮忙的朋友需要的话,请与我联系!
我的QQ: 8534669
 
这样用调试器不见得能解决问题,最好先从代码逻辑正向分析清楚。
 
谢谢iie!给你先加15分啦!
出错的源程序段如下,其中的两处Try是我怀疑出错而强加的,但是错误还是照出不误!
这段程序编译是完全通过了的,而且出错也不影响运行效果
For j:=1 to TotalPagesdo
begin
RunMsg('传真:发送第'+InttoHex(j,2)+'页共'+InttoHex(TotalPages,2)+'页') ;
sFaxPage := 'E:/公积金查询/GRAPHICS/Fax_Bfx/'
+sDjnPID+'_'+IntToHex(LineNo+1,3)+IntToHex(J,2)
+'.Bfx' ;
pFaxPage := PChar(sFaxPage) ;
PagesOfThis := 0 ;
Try
PagesOfThis := DJFax_SendFaxFile(FaxChn,pFaxPage) ;
Except
On Exceptiondo
begin
SaveMemoData ;
End ;
End ;
If PagesOfThis <= 0 then
begin
//无需发送
RunMsg('传真:无发送页') ;
End
else
begin
//需发送TotalPage页
//循环维持传真发送
RunMsg('传真:持续发送第'+InttoHex(j,2)+'页') ;
Repeat
// Edit1.Text := '传真:持续发送第'+InttoHex(j,2)+'页' ;
FaxTransed := 0 ;
Try
FaxTransed := DJFax_CheckTransmit(FaxChn) ;
Except
On Exceptiondo
begin
SaveMemoData ;
End ;
End ;
IsFaxEnd := False ;
//继续发送
Case FaxTransed Of
1 : begin
//发完传真
IsFaxEnd := True ;
//停止发送
RunMsg('传真:发完传真') ;
End ;
2 : begin
//发完一页
IsFaxEnd := False ;
//继续发送
RunMsg('传真:发完一张') ;
End ;
-1,-2 : begin
//发送传真失败
IsFaxEnd := True ;
//停止发送
RunMsg('传真:发送传真失败') ;
End ;
End ;
Until IsFaxEnd ;
End ;
End ;
DJFax_StopFax(FaxChn);
//停止传真发送
RunMsg('传真:发送完毕') ;
DJFax_ClearLink(FaxChn, LineNo) ;
RunMsg('传真:拆除语音卡与传真卡连接') ;
//x00026 传真完毕!
 
1,错误出现在什么地方可以确定吗?savememodata执行了吗?
2,pFaxPage := PChar(sFaxPage) ;这样的我没用过,我一直用strPcopy
 
未能确定呀!但明显的是在执行了
PagesOfThis := DJFax_SendFaxFile(FaxChn,pFaxPage) ;
之后。因为我已经从电话中听到了传真信号音,错误是在第二声传真音的时候发生的。
因为是线程运行的语音/传真系统,无法利用Debug作跟踪。所以无法确定是在那一句附近
出错的。
另外,由于是语音/传真系统,我每一条电话线路都启用一个线程作服务,所以实际运行的
环境是有相同的8个线程在运行,不知那样会不会是造成出错的原因。
 
map文件只对你自己的程序有用,在WINDOWS下大部分是库函数,FAX过程也是外部过程,MAP不到的.
在线程的EXECUTE处加断点,先定位问题语句才好办.
 
那些传真函数(API),应该不会有问题,看来是runmsg的问题,
你把runmsg都去掉或者做同步调用试一下
 
尝试过了!所有的rnmsg都封起来,可是故障照出,依然是听到第二声传真音之后,
可是就是没办法定位出错点!
 
定位错误的方法:
LID=532178,参见我的回答。
当然,还可以改进:
声明一个全局变量: FunctionName:String;
,在每个可能有问题的过程及语句执行之前对其进行设定。
例如:
function A:Integer;
var
Str:String;
begin
FunctionName:='A begin
.';
...
FunctionName:='A: try something. Str='+Str;
try
...
except
...
end;
FunctionName:='A: try somethingdo
ne.';
end;
放一个ApplicationEvents控件,在它的OnException事件中ShowMessage(FunctionName);就知道是哪
一句出错了。
BTW:
能不能吧您的问题贴子精简一下——如果每个贴子都50、100K的话,离线数据库早撑不住了。
(你自己的贴子可以修改,点击贴子的ID号就可以了)
 
creation-zy,首先谢谢你!
我真没辙啦!可能问题不是出在我的程序内部!用Try都无法隔离它出错!
 
我找到出错点了,是在调用
FaxTransed := DJFax_CheckTransmit(FaxChn) ;
的时候!但这个是东进的例程呀,我实在不知道为什么会出错的!
这是深圳东进公司www.dj.com.cn的D080F传真卡带来的例程,
可是东进公司没有给我答复!
 
多人接受答案了。
 
东进的语音卡不支持多线程
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
后退
顶部