You should try ICorDebugOLFrame->EnumerateArguments This is code for this : ICorDebugFrame *frame;//frame for this function
ICorDebugChain *chain;//chain including this frame ICorDebugModule *module;//module where the function is defined //--------------------- { ICorDebugValueEnum *valueEnum=0;HRESULT hr;ICorDebugILFrame *ILFrame=0; if (frame!=0){ frame->QueryInterface(IID_ICorDebugILFrame,(void **)&ILFrame); } if (ILFrame!=0){ hr=ILFrame->EnumerateArguments(&valueEnum); } ULONG cArguments; if (valueEnum!=0){ valueEnum->GetCount(&cArguments); valueEnum->Reset(); } //remember that first argument for nonstatic function is "this" value ICorDebugRegisterSet *registers=0;ICorDebugNativeFrame *nativeFrame=0; if (frame!=0){ hr=frame->QueryInterface(IID_ICorDebugNativeFrame,(void**)&nativeFrame); } ICorDebugProcess *process=0; if (module!=0){ module->GetProcess(&process); } if (ILFrame!=0){ ILFrame->Release(); } if (nativeFrame!=0){ nativeFrame->GetRegisterSet(®isters); nativeFrame->Release(); } for (unsigned int j=0;j<cArguments;j++) { ULONG32 valsize=0;ULONG retrieved;ICorDebugValue *argValue=0;CORDB_ADDRESS addr=0; DWORD bytesRetrieved=0;BYTE *val=0; if (valueEnum!=0){ hr=valueEnum->Next(1,(ICorDebugValue **)&argValue,&retrieved); argValue->GetSize(&valsize); hr=argValue->GetAddress(&addr); if (addr==0){ //some of arguments may be stored in registers //try nativeFrame->GetRegisterSet } else { val = new BYTE[valsize]; process->ReadMemory(addr,valsize,val,&bytesRetrieved); } } ----- Original Message ----- From: "John Keeney" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Friday, April 12, 2002 5:31 PM Subject: [DOTNET] InProc Profiler/Debugger ICorDebugILFrame::GetArgument > Hi All, > > Im trying to access the parameters to a function call in the Inproc > debugger. > > In a profiler when I catch function entry, I get access to the inproc > debugger interfaces and from that I get access to the current thread's > ICorDebugILFrame interface with ICorDebugThread::GetActiveFrame. > Then call ICorDebugILFrame::GetArgument. > > I think this is the best way to get access to the parameter values of a > function call in this profiler callback. (If not please tell me. I haven't > tried IMetaDataImport fully yet) > > When I call the GetArgument method it sometimes fails with > CORDBG_E_IL_VAR_NOT_AVAILABLE, but not always! > Even if ICorDebugILFrame::EnumerateArguments indicates that there are > arguments available, i can't access them with GetArgument! > (ICorDebugValueEnum::Next also fails with the same error) > > Note this works fine for some methods, but not for others even of the same > class. I really have no idea why. > eg > OK for: .ctor, Set_Property etc > Not OK for: ToString (overridden), ordinary public methods with standard > value type params, etc > > Has anyone any ideas? > > Thanks > John > > > #define CORDBG_E_IL_VAR_NOT_AVAILABLE EMAKEHR(0x1304) > // An IL variable is not available at the current native IP. > > You can read messages from the DOTNET archive, unsubscribe from DOTNET, or > subscribe to other DevelopMentor lists at http://discuss.develop.com. You can read messages from the DOTNET archive, unsubscribe from DOTNET, or subscribe to other DevelopMentor lists at http://discuss.develop.com.