2012-06-05 57 views
1

我必須爲某些目的而測試gcc。目標是能夠跟蹤在特別編譯期間調用哪些GCC函數。不幸的是,我對GCC的體系結構並不熟悉,所以我需要一點幫助。我嘗試了以下步驟:如何儀器gcc?

1)攻擊gcc/Makefile.in並向T_CFLAGS添加「-finstrument-functions」標誌。
2)我有一個已經實施和測試的版本start_testend_test函數。它們在調用toplev_main()之前和之後從gcc/main.c中調用。包含文件鏈接到gcc(該對象被添加到OBJS-common,並且依賴關係稍後在gcc/Makefile.in中定義)
3)使用contrib/download_prerequisites下載先決條件。
4)執行從一個乾淨的構建目錄中的配置(與源目錄相同的級別):./../gcc-4.6.2/configure --prefix="/opt/gcc-4.6.2/" --enable-languages="c,c++"
5)以「讓所有」

這樣,我拼命地跑出來的內存開始構建,雖然我有28G。
接下來,我嘗試從Makefile中刪除T_CFLAGS設置,併爲make命令提供-finstrument-functions:make CFLAGS="-finstrument-functions"。這種構建是成功的,但是當我試圖編譯一些東西時,它會產生空的輸出文件。 (理論上end_test本應將其結果寫入給定文件。)

我該怎麼做出錯? 在此先感謝!

+0

你想在編譯GCC的內部函數時跟蹤嗎?或者你在編譯什麼? –

回答

1

除非你專門從儀器中排除,main本身會因儀器,所以撥打電話到您start_testend_testmain是你並不怎麼想這樣做。 「正確」的方法,以確保文件被打開和關閉在正確的時間是定義一個「構造」和「析構函數」,以及GCC之前和main後自動生成調用它們:

void start_test (void) 
    __attribute__ ((no_instrument_function, constructor)); 

void end_test (void) 
    __attribute__ ((no_instrument_function, destructor)); 

/* FILE to write profiling information. */ 
static FILE *profiler_out; 

void start_test (void) 
{ 
    profiler_out = fopen ("profiler.out", "w"); 
    if (profiler_out == NULL) 
    exit (-1); 
} 

void end_test (void) 
{ 
    fclose (profiler_out); 
} 

腳註:

  1. 瞭解更多關於constructordestructorno_instrument_function屬性here。它們是GCC理解的功能屬性。
  2. 請閱讀IBM網站上的excellent guide to instrumentation
+0

好吧,讓我們看看我是否正確理解你: 你上面的代碼草圖進入助手文件,讓我們說到Instrumenter.c中,鏈接到項目。此外,我必須將-finstrument-functions標誌傳遞給CFLAGS。就這樣?我不需要在任何地方調用start_test和end_test函數嗎? – mirage

+0

@ user1437750 - 不,你不需要那樣做。 GCC插入本身在'main'之前和之後調用'start_test'('constructor')和'end_test'('destructor')。 – ArjunShankar

+0

@ user1437750 - 我在網址中添加了一些備註和答案。 – ArjunShankar