2014-04-14 30 views
1

我在一個項目中製作一個剖析器,並且我想讓它易於集成到我的項目中。我在/ GH/Gh編譯器標誌中使用了penter和pexit,因此每次調用或返回函數時都會調用這些函數。現在,基本上我需要在我的項目中完成的工作是在全局範圍內的任何地方複製plite和pexit函數,並且工作正常,但我想創建一個宏,因此它基本上只是插入函數。我的Profiler.h文件並將其包含在我的其他項目中。我得到的錯誤是用於penter和pexit的Visual Studio宏

error C2598: linkage specification must be at global scope 
error C2601: '_pexit' : local function definitions are illegal 
error C1075: end of file found before the left brace '{' at 'path/main.cpp' was matched 

注意「路徑/ main.cpp的」是一個漫長的道路,以我的項目(非探查項目),並主要是在那裏我「叫」宏

這裏是我的宏,我必須理解這些錯誤。我估計它剛剛插入的功能它被「叫」

#define PENTER           \ 
extern "C" void __declspec(naked) _cdecl _penter(void) \ 
{              \ 
    _asm push ebp;           \ 
    _asm mov ebp, esp;          \ 
    _asm pushad;           \ 
    Profiler::GetInstance().Enter();      \ 
    _asm popad;           \ 
    _asm mov esp, ebp;          \ 
    _asm pop ebp;           \ 
    _asm ret;            \ 
}              \ 


#define PEXIT           \ 
extern "C" void __declspec(naked) _cdecl _pexit(void) \ 
{              \ 
    _asm push ebp;           \ 
    _asm mov ebp, esp;          \ 
    _asm pushad;           \ 
    Profiler::GetInstance().Exit();      \ 
    _asm popad;           \ 
    _asm mov esp, ebp;          \ 
    _asm pop ebp;           \ 
    _asm ret;            \ 
}              \ 

感謝您的幫助!

+1

查看此前的代碼,包括在此之前包含#included的任何.h文件。有一個}失蹤。 –

+0

我將我的宏複製到它們被調用的相同位置,它可以工作,沒有問題,而且不會改變任何其他地方 – user2013535

回答

0

你很可能在你的profiler.h之前的某個地方缺少一個}。

我會使用inline函數而不是多線宏。

的extern 「C」 內嵌無效__declspec(裸)_cdecl _pexit(無效) {
_asm PUSHAD; Profiler :: GetInstance()。Exit(); _asm popad; _asm ret; }

(這樣,實際上可能在調試時進入函數 - 至少在調試模式下,當它沒有內聯時)。

我也去掉了完全沒必要esp/ebp保存和恢復 - PUSHAD將保存所有寄存器爲你(甚至ESP)和技術,你只需要保存/恢復臨時寄存器,EAX,ECX和EDX,如所有其他寄存器必須由您所調用的功能保存。

0

您可以嘗試micro-profiler來完成這項任務。或者把它的源代碼從這裏收集起來:hooks.asm 它的好處是它也適用於x64(不能在x64 cpp中注入彙編指令)。