您的位置:首页 > 其它

调试Windows Media SDK时出现的异常中断

2007-12-17 10:50 597 查看

调试WindowsMediaSDK时出现的异常中断

Articlelastmodifiedon2002-5-20

----------------------------------------------------------------

Theinformationinthisarticleappliesto:

-MicrosoftWindowsMediaFormatSDK7.0

-MicrosoftVisualC++,32-bitEditions,version6.0,SP5

----------------------------------------------------------------

TableofContents[/b]

调试WindowsMediaSDK时出现的异常中断...1

现象:...1

原因:...3

使用过WindowsMediaSDK的兄弟们,几乎都应该遇到过这种问题。我好像没有看到微软对此有所表示,不知道有没有专门针对于此的KB文章。

现象:

当调试至下面代码的红色语句时,出现BreakPoint中断:

HRESULTAddAudioStream(DWORDdwFormatTag,

DWORDdwBitrate,

DWORDdwSampleRate,

DWORDdwChannels,

DWORDdwFlags,

IWMProfile*pIWMProfile,

IWMProfileManager

*pIWMProfileManager)

{

HRESULThr=S_OK;

IWMStreamConfig*pIWMStreamConfig=NULL;

IWMMediaProps*pIMP=NULL;

IWMCodecInfo*pIWMInfo=NULL;

WAVEFORMATEX*pSaveWFX=NULL;

WM_MEDIA_TYPE*pType=NULL;

try

{

do

{

hr=

pIWMProfileManager->QueryInterface(IID_IWMCodecInfo,

(void**)&pIWMInfo);

if(FAILED(hr))

{

returnhr;

}

DWORDi,j;

DWORDcCodecs;

hr=pIWMInfo->GetCodecInfoCount(WMMEDIATYPE_Audio,

&cCodecs);

对话框内容为:

[dialogMicrosoftVisualC++]
UserBreakpointcalledfromcodeat0x77fa018c
它的定位:
DbgBreakPoint:
77FA018Cint3
VC的Output窗口打出这样的话:
HEAP[elcc.exe]:InvalidAddressspecifiedtoRtlFreeHeap(2d70000,2d751f8)

当时的堆栈调用信息为:

NTDLL!DbgBreakPointaddress0x77fa018c

NTDLL!RtlpNtEnumerateSubKey+19613bytes

NTDLL!RtlpNtEnumerateSubKey+16147bytes

NTDLL!RtlDestroyHandleTable+1918bytes

NTDLL!77fcba9e()

MSMS001!VoodooUnQuery+28632bytes

MSMS001!VoodooUnQuery+27049bytes

MSMS001!VoodooUnQuery+-3737bytes

VCT3216!Dcmp

其实很久以来,在新闻组中大约有6、7个人说过这个问题,但是一直没有人回答为什么和怎么解决。

比如,EdEichman说:

Ihadquiteafewproblemsgettingthegenprofilesample[from
theWindowsMediaFormatSDK]todoANYTHINGonmymachinebesides
givinguserbreakswithHEAP[genprofile.exe]:InvalidAddress
specifiedtoRtlFreeHeap(4d70000,4d73f30)untilIgottiredof
hittingOK.Stackcrawlwassomething"helpful"like:
NTDLL!77f7629c()
NTDLL!77f8c4de()
NTDLL!77f7e587()
NTDLL!77f64f43()
MSMS001!04d17b68()
MSMS001!04d17539()
MSMS001!04d0fcf7()
VCT3216!044a4326()

比如,MalcolmNixon说:

WheneverItryexecuting

thepIWMAudioWriter->SetOutputFormat(...)linetheprogram

printsthefollowingmessagethenfaults:

HEAP[WMATest.exe]:InvalidAddressspecifiedto

RtlFreeHeap(2460000,2d00000)

I'vetrieddifferentargumentstoSetOutputFormatbutto

noavail.

原因:

看着下面的output报告,这些加载的DLL都是在执行初始化WindowsMediaFormatSDK的IWMWriter接口时加载的:

LOAD_DLLbase:04600000msdmo.dll

LOAD_DLLbase:53600000DEFFILE.dll

LOAD_DLLbase:74F10000IMAADP32.dll

LOAD_DLLbase:75CE0000MSADP32.dll

LOAD_DLLbase:74EF0000MSG711.dll

LOAD_DLLbase:74EC0000MSGSM32.dll

LOAD_DLLbase:74EB0000TSSOFT32.dll

LOAD_DLLbase:661D0000tsd32.dll

LOAD_DLLbase:74F00000lhacm.dll

LOAD_DLLbase:74ED0000msg723.dll

LOAD_DLLbase:63F40000IAC25_32.ax

LOAD_DLLbase:1C200000MSAUD32.ACM

LOAD_DLLbase:04F40000sl_anet.acm

LOAD_DLLbase:04F60000VCT3216.acmLOAD_DLLbase:04F80000vct3216.dll

LOAD_DLLbase:057F0000MSMS001.vwpLOAD_DLLbase:05C70000mvoice.vwp

OutDbStr:HEAP[CallDesigner.exe]:

OutDbStr:InvalidAddressspecifiedtoRtlFreeHeap(5860000,5864228)

红色的DLL就是根源!

VCT3216.acm就在你的%System32%目录下。它是一个audiocodecdriver。但是它的调试版本中由于某种原因有异常行为。
你可以删除它。但是据EdEichman说并不解决问题。
也可以选择pass这个breakpoint对话框,但是你必须连续跳过这个对话框214次!J
我确实这么做过,连续按了214次F5,和214次确定,终于通过了地雷阵。J
你可以看到这最后一次的output之后,是加载另一个DLL,说明异常确实发生在这几个acm和vwp中:

OutDbStr:HEAP[CallDesigner.exe]:

OutDbStr:InvalidAddressspecifiedtoRtlFreeHeap(5860000,6144140)

LOAD_DLLbase:063F0000l3codeca.acm

OutDbStr:EnterInitWriter

做VirtualDubvideo免费程序的作者,在MSMS001.vwp中也步入了同样的怪圈。MSMS001.vwp和VCT3216.acm一样,都是Voxwarefamilyofcodecs的一部分。

不过看样子,人家并不打算修正这个问题。

所以,你可以买一个自动击键器预备着。

Writtenbyzhengyun@tomosoft.com

Trackback:http://tb.blog.csdn.net/TrackBack.aspx?PostId=12666
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: