我正在调试windbg中的x86 DLL,特别是一个应该具有以下签名的函数:
bool __cdecl func(LPVOID p1, LPVOID p2, wchar_t* p3, size_t p4, LPVOID p5)
不导出该功能。 AFAIK __cdecl
应该收到堆栈上的所有参数,调用者应该清除堆栈。
但事实并非如此。 Windbg说调用约定是__cdecl
,但前两个参数在ecx
和edx
上传递,就像__fastcall
函数一样。函数本身也在清除堆栈,我认为不应该由__cdecl
函数完成。
我试图挂钩该功能但没有成功。我试图将绕行函数设为__cdecl
和__fastcall
,两者都会导致崩溃。
有什么建议吗?
答案 0 :(得分:6)
如果函数在可执行文件(不是库)中或仅在同一个DLL中调用,则编译器可以根据需要优化调用约定。
如果编译器知道两端(调用者和被调用者),并且知道该函数不会被导出到另一个单元(就像它与库一样),那么它可以在任何方向上进行优化。
那么:函数是完成的可执行文件的一部分吗?你有优化吗?
我建议关闭优化功能,然后再试一次。