我在项目中扩展了图标覆盖。它是ATL COM DLL。当前有五个图标有其自己的类,该类已在各个类中实现了接口方法。 我使用了一些静态变量,例如临界区对象池。 工作正常。但是,在进行验证时,我每10分钟重启一次机器,并每5分钟重启一次浏览器。 我发现崩溃指向静态变量。我猜想静态变量会在任何正在进行的线程完成之前被销毁,或者可能是未初始化的关键部分。
例如我有五个类,如CmyoverlayIcon1 .... CmyoverlayIcon5
类ATL_NO_VTABLE CmyoverlayIcon2:
public CComObjectRootEx<CComSingleThreadmodel>,
public CComCoClass<CmyoverlayIcon2,&CLSID_myoverlayIcon2>,
public IDispatchImpl<ImyoverlayIcon2,&IID_ImyoverlayIcon2,
&LIBID_OverlayIconLib,/*wMajor =*/ 1,/*wMinor =*/ 0>,
public IShellIconOverlayIdentifier
I am maintaining the object pull of five and guarding static object with the help of static critical section.
struct INIT
{
INIT()
{
InitAll();//Initializes CS
}
~INIT()
{
DeInitAll();//Deletes CS.
}
};
//Just to init/deinit critical section.
static struct INIT temp;
EnterCriticalSection(&s_obCS);
if (LocateFreeObject(iter))
{
}
After ~8-9 hours it gives me crash with below call stack
PROBLEM_CLASSES:
ID: [0n292]
Type: [@accESS_VIOLATION]
Class: Addendum
Scope: BUCKET_ID
Name: Omit
Data: Omit
PID: [Unspecified]
TID: [0x1408]
Frame: [0] : ntdll!RtlpWaitOnCriticalSection
ID: [0n265]
Type: [INVALID_POINTER_WRITE]
Class: Primary
Scope: BUCKET_ID
Name: Add
Data: Omit
PID: [Unspecified]
TID: [0x1408]
Frame: [0] : ntdll!RtlpWaitOnCriticalSection
ID: [0n290]
Type: [NULL_CLASS_PTR_WRITE]
Class: Primary
Scope: DEFAULT_BUCKET_ID (Failure Bucket ID prefix)
BUCKET_ID
Name: Add
Data: Omit
PID: [0xebc]
TID: [0x1408]
Frame: [0] : ntdll!RtlpWaitOnCriticalSection
BUGCHECK_STR:APPLICATION_FAULT_NULL_CLASS_PTR_WRITE_INVALID_POINTER_WRITE
PRIMARY_PROBLEM_CLASS:APPLICATION_FAULT
LAST_CONTROL_TRANSFER:从00007ff90393b5f6到00007ff9039272a6
STACK_TEXT:
00000000 0697efd0 00007ff9
0393b5f6:00000000 06f502b4 00000000
06f50000 00000000 fffffffa 00000000
07129280:ntdll!RtlpWaitOnCriticalSection + 0xa6
00000000 0697f0b0 00007ff9
0393b440:00000000 00000000 00000000
06f50f00 00000000 0622f3d0 00000000
06f50000:ntdll!RtlpEnterCriticalSectionContended + 0x1a6
00000000 0697f110 00007ff8
e8d82e87:00000000 00000050 00000000
06f50cc0 00000000 00360062 00000000
00000000:ntdll!RtlEnterCriticalSection + 0x40
00000000 0697f140 00007ff8
e8d7931c:00000000 0697f468 00000000
00000040 00000000 0000001f 00000000
71c5cc87:OverlayIcon!CShellObjFactory :: GetFCObject + 0x67
00000000 0697f2c0 00007ff8
e8d79673:00000000 00000001 00000000
05378fb0 00000000 0000000e 00007ff9
0393aa9e:OverlayIcon!IfClassTypeMatching + 0x2c
00000000 0697f4c0 00007ff9
03110e45:00000000 071270b8 00000000
05378fb0 00000000 00000030 00007ff9
0310448d:OverlayIcon!CmyoverlayIcon2 :: IsMemberOf + 0xc3
00000000 0697f550 00007ff9
03110d16:00000000 05327ce0 00007ff9
030a3315 00000000 80004005 00000000
0697f7d0:shell32!CFSIconOverlayManager :: _ GetFileOverlayInfo + 0x111
00000000 0697f630 00007ff9
011f5681:00000000 00000000 00000000
0697f6e8 00000000 0436e580 00000000
00000000:shell32!CFSIconOverlayManager :: GetFileOverlayInfo + 0x46
00000000 0697f670 00007ff9
012713b0:00000000 00000000 00000000
053c1530 00000000 00000000 00000000
00000000:windows_storage!CFSFolder :: _ GetOverlayInfo + 0x179
00000000 0697f730 00007ff9
01267342:00000000 7fffffff 00007ff9
03830000 00000000 053c29c0 00007ff9
0395fc11:windows_storage!CDesktopFolder :: GetOverlayIndex + 0x50
00000000 0697f780 00007ff9
011f014b:00007ff9 0161ea18 00000000
00000003 00000000 0547c870 00000000
00000000:windows_storage!CRegFolder :: GetOverlayIndex + 0x82
00000000 0697f7b0 00007ff9
011ef896:00000000 05376880 00000000
00000000 00000000 05376300 00000000
053b88d8:windows_storage!CIconOverlayTask :: DispatchTasks + 0xdb
00000000 0697f830 00007ff9
01260bb1:00000000 00000001 00000000
0547cb00 00000000 00000000 00000000
0436b450:windows_storage!CIconOverlayTask :: InternalResumeRT + 0x126
00000000 0697f8c0 00007ff9
012494c4:00000000 00000ebc 00000000
054d3480 00000000 054d3470 00000000
0000000d:windows_storage!CRunnabletask :: Run + 0xc1
00000000 0697f910 00007ff9
01249105:00000000 0429b390 ffffffff
fffffffe 00000000 00000000 ffffffff
fffffffe:windows_storage!CShellTask :: TT_Run + 0x3c
00000000 0697f940 00007ff9
01248fe5:00000000 0429b390 00000000
0429b390 00000000 00000000 00007ff9
0395fc11:windows_storage!CShellTaskThread :: ThreadProc + 0xdd
00000000 0697f9f0 00007ff9
038626f6:00000000 00000000 00000000
00000000 0000e037 0f6ca824 00000000
00300008:windows_storage!CShellTaskThread :: s_ThreadProc + 0x35
00000000 0697fa20 00007ff9
0394f6d5:00000000 0541ebf0 00000000
008010e8 00000000 00000001 00000000
0000000b:SHCore!ExecuteWorkItemThreadProc + 0x16
00000000 0697fa50 00007ff9
03954634:00000000 00000000 00000000
0406d320 00007ff9 038626e0 00000000
008010e8:ntdll!RtlpTpWorkCallback + 0x165
00000000 0697fb30 00007ff9
025c7bd4:00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000:ntdll!TppWorkerThread + 0x8d4
00000000 0697fef0 00007ff9
0398ced1:00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000:kernel32!BaseThreadInitThunk + 0x14
00000000 0697ff20 00000000
00000000:00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000:ntdll!RtlUserThreadStart + 0x21
注意:如果我评论静态DeleteCriticalSection()调用,那么它将解决我的问题。 我在一些地方走了几步,发现了破坏的顺序,并将sleep(5000)放在ATL COM的DllCanUnloadNow()中,没有发现崩溃。
非常感谢您的帮助。