У меня есть интересная проблема в моем приложении Delphi 2009.при запуске в отладчике я получаю AV между ключевым словом Begin подпрограммы и первым оператором.Я считаю, что это когда он устанавливает локальные переменные.Вот информация, показанная в отладчике:
uDeviceModule.pas.940: begin // _GetMeasurementsForChannel
00AF24C8 55 push ebp
00AF24C9 8BEC mov ebp,esp
00AF24CB 51 push ecx
00AF24CC B9E9A90100 mov ecx,$0001a9e9 // isn't this a lot for the stack?
// error happens in here
00AF24D1 6A00 push $00
00AF24D3 6A00 push $00
00AF24D5 49 dec ecx
00AF24D6 75F9 jnz $00af24d1
00AF24D8 874DFC xchg [ebp-$04],ecx
00AF24DB 53 push ebx
00AF24DC 894DF4 mov [ebp-$0c],ecx
00AF24DF 8955FC mov [ebp-$04],edx
00AF24E2 8945F8 mov [ebp-$08],eax
00AF24E5 33C0 xor eax,eax
00AF24E7 55 push ebp
00AF24E8 687D2FAF00 push $00af2f7d
00AF24ED 64FF30 push dword ptr fs:[eax]
00AF24F0 648920 mov fs:[eax],esp
uDeviceModule.pas.941: SelectChannel(eChannelNum); // first statement
Это упрощенная версия этой вложенной подпрограммы (см. ниже).
procedure TDeviceModule.GetMeasurements(ExpInfo:TExpInfo;
_DisplayList:TMeasDisplayListAncestor; eExposureStatus:TExposureStatus;
bActiveErrorEnabled:boolean);
procedure _GetMeasurementsForChannel(_DisplayList:TObjectList;
eChannelNum:TDeviceChannelNum; eExposureStatus:TMyEnum;
bActiveErrorEnabled:boolean);
var
// these are all objects (not records)
selChannel:TDeviceChannel;
det:TDeviceDetector;
shoKVMeas:TStoMeasurement;
begin // ********************* error happens on this line
SelectChannel(eChannelNum);
_GetMeasurement(ExpInfo, _DisplayList, eChannelNum, eExposureStatus, ctdVal1);
_GetMeasurement(ExpInfo, _DisplayList, eChannelNum, eExposureStatus, ctdVal2);
_GetMeasurement(ExpInfo, _DisplayList, eChannelNum, eExposureStatus, ctdVal3);
end; // _GetMeasurementsForChannel
begin
// blah blah blah
_GetMeasurementsForChannel(_DisplayList,
eChannelNum,
eExposureStatus,
bActiveErrorEnabled);
// blah blah blah
end;
это однопоточное приложение.
Как бы вы посоветовали мне найти причину этой проблемы?мои первые мысли были:
1) увеличить максимальный размер стека - я сделал, но это ничего не изменило.сейчас это 160000 долларов (1441792), но до этого я думаю, что это было 150000 долларов.2) этот объект все еще действителен?кажется ... он правильно отвечает на метод ClassName, и FastMM не предупреждает меня о каких-либо проблемах.
Интересно, что в трассировке стека ничего не говорится о подпрограмме, в которой возникает проблема.
:7e42b35c USER32.MoveWindow + 0xbe
:7e4565b7 USER32.GetRawInputDeviceInfoW + 0x5f
:7e428eec ; C:\WINDOWS\system32\USER32.dll
:7c90e473 ntdll.KiUserCallbackDispatcher + 0x13
ActnMenus.CallWindowHook(???,0,$31104)
:7e42b372 USER32.MoveWindow + 0xd4
:7e4565b7 USER32.GetRawInputDeviceInfoW + 0x5f
:7e428eec ; C:\WINDOWS\system32\USER32.dll
:7c90e473 ntdll.KiUserCallbackDispatcher + 0x13
:007b882d aqDockingWndProcHook + $1D
:7e42b372 USER32.MoveWindow + 0xd4
:7e4565b7 USER32.GetRawInputDeviceInfoW + 0x5f
:7e428eec ; C:\WINDOWS\system32\USER32.dll
:7c90e473 ntdll.KiUserCallbackDispatcher + 0x13
:7e428dd9 USER32.DefWindowProcW + 0xb9
:7e428d77 USER32.DefWindowProcW + 0x57
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e42a013 USER32.IsWindowUnicode + 0xa1
:7e42a039 USER32.CallWindowProcW + 0x1b
Controls.TWinControl.DefaultHandler(???)
:0050fac8 TWinControl.DefaultHandler + $DC
:0050b4b9 TControl.WndProc + $2D5
:0050f9cc TWinControl.WndProc + $518
:0050f0e3 TWinControl.MainWndProc + $2F
:0048874e StdWndProc + $16
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e428ea0 ; C:\WINDOWS\system32\USER32.dll
:7e428eec ; C:\WINDOWS\system32\USER32.dll
:7c90e473 ntdll.KiUserCallbackDispatcher + 0x13
:7e428dd9 USER32.DefWindowProcW + 0xb9
:7e428d77 USER32.DefWindowProcW + 0x57
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e42a013 USER32.IsWindowUnicode + 0xa1
:7e42a039 USER32.CallWindowProcW + 0x1b
:0050fac8 TWinControl.DefaultHandler + $DC
:0050f9cc TWinControl.WndProc + $518
:0050f0e3 TWinControl.MainWndProc + $2F
:0048874e StdWndProc + $16
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e428ea0 ; C:\WINDOWS\system32\USER32.dll
:7e428eec ; C:\WINDOWS\system32\USER32.dll
:7c90e473 ntdll.KiUserCallbackDispatcher + 0x13
:7e428dd9 USER32.DefWindowProcW + 0xb9
:7e428d77 USER32.DefWindowProcW + 0x57
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e42a013 USER32.IsWindowUnicode + 0xa1
:7e42a039 USER32.CallWindowProcW + 0x1b
:0050fac8 TWinControl.DefaultHandler + $DC
:0050f9cc TWinControl.WndProc + $518
:0050f0e3 TWinControl.MainWndProc + $2F
:0048874e StdWndProc + $16
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e428ea0 ; C:\WINDOWS\system32\USER32.dll
:7e428eec ; C:\WINDOWS\system32\USER32.dll
:7c90e473 ntdll.KiUserCallbackDispatcher + 0x13
:7e428dd9 USER32.DefWindowProcW + 0xb9
:7e428d77 USER32.DefWindowProcW + 0x57
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e42a013 USER32.IsWindowUnicode + 0xa1
:7e42a039 USER32.CallWindowProcW + 0x1b
:0050fac8 TWinControl.DefaultHandler + $DC
:0050f9cc TWinControl.WndProc + $518
:0065279d TcxControl.WndProc + $121
:0070b38d TcxCustomGrid.WndProc + $5
:0048874e StdWndProc + $16
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e428ea0 ; C:\WINDOWS\system32\USER32.dll
:7e428eec ; C:\WINDOWS\system32\USER32.dll
:7c90e473 ntdll.KiUserCallbackDispatcher + 0x13
:7e428dd9 USER32.DefWindowProcW + 0xb9
:7e428d77 USER32.DefWindowProcW + 0x57
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e42a013 USER32.IsWindowUnicode + 0xa1
:7e42a039 USER32.CallWindowProcW + 0x1b
:0050fac8 TWinControl.DefaultHandler + $DC
:0050f9cc TWinControl.WndProc + $518
:0065279d TcxControl.WndProc + $121
:0075bbc4 TcxGridSite.WndProc + $20
:0048874e StdWndProc + $16
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e428ea0 ; C:\WINDOWS\system32\USER32.dll
:7e428eec ; C:\WINDOWS\system32\USER32.dll
:7c90e473 ntdll.KiUserCallbackDispatcher + 0x13
:0044c91e HandleException + $22A
:004539af InterceptAHandleExcept + $3F
:0048874e StdWndProc + $16
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e4189cd ; C:\WINDOWS\system32\USER32.dll
:7e418a10 USER32.DispatchMessageW + 0xf
это наводит меня на мысль, что проблема заключается в переполнении стека в некотором роде.при обработке сообщений.
предложения ???СПАСИБО!