Ik ben bezig om een fout op te sporen in een third party applicatie. De applicatie bestaat uit drie delen:
De glue DLL laadt de backend met de volgende code:
Hierna verschijnt de geladen dll echter niet in de modules list. Als ik daarna een van de dll-exports aanroep, wordt die functie wel uitgevoerd, maar als ik er probeer in te steppen gaat dit niet. (step into gedraagt zich als step over)
Als ik in GetConsoleSupport een fout veroorzaak, (bijv *((INT*)0)=1; ) dan wordt die fout door VS2005 gemeld als een fout in de glue-dll, niet op de plek waar ik die fout veroorzaak, met een "[Managed to native transition]" boven op de callstack. DebugBreak() in de backend DLL wordt genegeerd. Ook als ik op een later moment de debugger attach, gedraagt die zich alsof de backend DLL niet geladen is; zelf niet als er op dat moment code uit de backend DLL wordt uitegevoerd.
Ik ben inmiddels een beetje radeloos. Code debuggen zonder step-functie is eigenlijk niet haalbaar, en de backend-dll buiten de frontend om debuggen is ook niet zinvol (ik moet echt de interactie tussen die twee hebben). Heeft iemand een idee hoe ik vs2005 zo ver krijg om zich te gedragen zoals het zich bij andere code gedraagt?
- Een frontend, geschreven in c#
- Een "glue-dll" geschreven in managed c++
- Een backend dll, geschreven in c++
De glue DLL laadt de backend met de volgende code:
C++:
1
2
| pin_ptr<const wchar_t> Ptr = PtrToStringChars(KnownPlatforms[PlatformIndex].DLL); CachedData.DLLHandle = LoadLibraryW(Ptr); |
Hierna verschijnt de geladen dll echter niet in de modules list. Als ik daarna een van de dll-exports aanroep, wordt die functie wel uitgevoerd, maar als ik er probeer in te steppen gaat dit niet. (step into gedraagt zich als step over)
C++:
1
2
3
| // get the function pointer to the accessor FuncGetBackendSupport GetSupportFunc = (FuncGetBackendSupport)GetProcAddress(CachedData.DLLHandle, "GetBackendSupport"); CachedData.BackendSupport = GetSupportFunc(); |
Als ik in GetConsoleSupport een fout veroorzaak, (bijv *((INT*)0)=1; ) dan wordt die fout door VS2005 gemeld als een fout in de glue-dll, niet op de plek waar ik die fout veroorzaak, met een "[Managed to native transition]" boven op de callstack. DebugBreak() in de backend DLL wordt genegeerd. Ook als ik op een later moment de debugger attach, gedraagt die zich alsof de backend DLL niet geladen is; zelf niet als er op dat moment code uit de backend DLL wordt uitegevoerd.
Ik ben inmiddels een beetje radeloos. Code debuggen zonder step-functie is eigenlijk niet haalbaar, en de backend-dll buiten de frontend om debuggen is ook niet zinvol (ik moet echt de interactie tussen die twee hebben). Heeft iemand een idee hoe ik vs2005 zo ver krijg om zich te gedragen zoals het zich bij andere code gedraagt?
Localhost, sweet localhost