.Net CF 응용 프로그램에서는 문제가 발생하지 않는 코드 부분에서 이상한 오류가 발생합니다. 예를 들어, 다음 코드 AddParm를 호출WinCE 6.0 R3. NET CF 프레임 워크 코드의 이상한 예외
public void AddParm(string str)
{
string[] pair = str.Split('=');
string key = pair[0].Trim();
string value = pair.Length > 1 ? pair[1] : "";
if (key.Length > 0)
{
if (_parmTable.ContainsKey(key))
_parmTable[key] = value;
else
_parmTable.Add(key, value);
}
}
루틴() 모든 예외 유형 잡기, try ... catch 블록 안에 전화를 래핑합니다.
public void Unpack(string txn)
{
try
{
// split out strings like: "EVENTLABEL:x=1,y=2,z=3"
char chEvent = ':';
char chSeparator = ',';
_parmTable = new Hashtable();
int iEvent = txn.IndexOf(chEvent);
if (iEvent == -1)
_eventLabel = txn;
else
{
_eventLabel = txn.Substring(0, iEvent);
string parms = txn.Substring(iEvent + 1).TrimEnd('\n');
string[] items = parms.Split(chSeparator);
if (items.Length <= 0)
AddParm(parms);
else
foreach (string item in items)
AddParm(item);
}
}
catch (Exception ex)
{
AppLog.logException(string.Format("UnpackedTask.Unpack: Error parsing '{0}'", txn), ex);
}
}
오류가 발생한 모듈을 mscoree3_5.dll로 나열하는 코어 처리되지 않은 예외가 생겼습니다. 스택 추적에 표시됩니다 :
at ArrayList.InternalSetCapacity(Int32 value, Boolean updateVersion) at ArrayList.EnsureCapacity(Int32 min) at ArrayList.Add(Object value) at String.Split(Char[] separator) at AddParm(String str)
이것은 작업자 스레드에서 발생합니다.
Main에 AppDomain.CurrentDomain.UnhandledException 처리기를 등록했지만 예외도 catch하지 않았습니다.
불행히도 WinCE 오류 대화 상자에는 mscoree3_5.dll 및 스택 추적에 오류 메시지가 표시되거나 오류 메시지가 표시됩니다.
우리는 AddParm에 의해 파싱되는 값을 만들고 AddParm은 Split 호출 전에 잠재적 인 문제를 잡을만큼 충분히 방어 적이라고 생각합니다. AddParm이 호출되는 방식으로 인해 null 문자열로 호출되지 않습니다. AddParm이 유효하지 않은 무언가로 호출 될 수 있다고는 생각하지 않지만 Try ... Catch는 항상 예외를 catch해야하지만 그렇지 않습니다. 이 같은
마찬가지로 우리는 또한 본 캐치되지 않는 오류 :
A native exception has occurred on BbCore.exe At RuntimeType.InternalGetField(rt…) At RuntimeType.InternalGetField(rt…) At SRSupport.GetString() At SRSupport.GetString() At IPAddress.Parse(String ipString)
여기에 하나에서 전체 스택 추적이 아침 :
At CurrentSystemTimeZone.GetDaylightChanges(Int32 year) At CurrentSystemTimeZone.GetUtcOffsetFromUniversalTime(DateTime time, Boolean& isAmbiguousLocalDst) At CurrentSystemTimeZone.ToLocalTime(DateTime time) At DateTime.ToLocalTime() At DateTime.get_Now() At MainLoop.timer1_Tick(Object sender, EventArgs e) At Timer._WnProc(WM wm, Int32 wParam, Int32 lParam) At ApplicationThreadContext._InternalContextMessages(WM wm, Int32 wParam, Int32 lParam) At NativeMethods.GetMessage(MSG& lpMsg, IntPtr hWnd, UInt32 wMsgFilterMin, UInt32 wMsgFilterMax) At Application2.Pump() At Application2.RunMessageLoop(Boolean showForm) At Application2.Run(Form mainForm, Boolean runAsSingletonApp, Boolean displayMainForm) At Startup.Main()
응용 프로그램 2 참조가 OpenNetCF.Windows의 사용에 기인 .Forms.dll. 코드의 해당 부분에서 충돌을 본 적이 없습니다. 기본적으로 무작위입니다.
IPAddress.Parse가 모든 예외 유형을 포착하는 Try ... Catch 내에서 호출되는 또 다른 경우입니다. 이 경우 파스가 빈 문자열로 호출 될 수 있다고 생각하지만 왜 처리되지 않은 예외로 나타나고 처리되지 않은 예외 처리기에 잡히지 않고 대신 WindowsCE에 걸렸습니다. 예외 처리기로 인해 전체 앱이 중단되었습니다.
R2에서 WinCE 6 R3 플랫폼 빌더로 업데이트 한 이후로 더 일반적인 것 같습니다. 나는 그들이 R2에서 일어난 적이 있는지 확실하지 않지만 확실히 덜 빈번했다. 지금도 항상 그런 것은 아닙니다. 나는 믿을 수 없을만큼 재현 할 수 없습니다.
아이디어가 있으십니까? 왜 프레임 워크의 핵심 부분이 Try..Catch에 의해 잡히지 않는 오류를 던질 것입니까?
추가 정보 : 중요한 정보를 빠뜨린 것 같습니다. ExceptionCode는 네이티브 메모리 부족 예외로 나타나는 0x80000002로 나열됩니다. 가비지 컬렉터에 따르면 우리 앱은 거의 1MB 이상의 메모리를 거의 사용하지 않습니다. coredll.dll의 GlobalMemoryStatus에 따르면 시스템의 일반적인 메모리로드는 약 29 %입니다 (57MB 중 41MB가 사용되지 않음). 시간이 지남에 따라 전체 시스템 메모리 사용을 모니터링하고 기록 할 수있는 유용한 유틸리티가 있습니까? 메모리 사용량을 측정하는 데 사용하는 기술이 내가 생각한만큼 정확하지 않은지 궁금해지기 시작했습니다. OpenNetCF.ToolHelp.ProcessEntry 사용하기.GetProcesses()는 약 3.6MB를 사용하는 프로세스와 약 2.5MB를 사용하는 NK.exe를 보여줍니다.
"AddParm"메서드를 호출하는 코드와 모든 세부 정보 (전체 스택)가 포함 된 전체 예외 메시지를 포함 할 수 있습니까? –
사실 저는 더 이상 전체 스택을 가지고 있지 않습니다. 내가 보여준 것 이상의 모든 호출은 내부 메소드입니다. WinCE에서이 오류가 발생하고 화면에 표시되기 때문에 더 이상 필요하지 않은 이유가 있습니다. 잡히지 않아서 기록되지 않으며 이후 여러 번 재 작업을 재부팅하여 오류가 발생하기 때문에 다시 일어난다. –