2010-01-12 77 views
1

我有下面的代碼片段的東西類似:我可以在包含的代碼中設置斷點嗎?

// file alpha.c 
void function_A() 
{ 
    int i; 
    #include "code.h" 
} 

//file beta.c 
void function_B() 
{ 
    int i; 
    #include "code.h" 
} 

// file code.h 
for(i = 1;i < 10;i++) 
{ 
    // do some stuff 
    if (very_rare_event) 
    { 
     // do something else 
    } 
} 

是的,我充分認識到它打破各種編碼實踐,但這是另一個故事(它是一個非常龐大,非常複雜,非常舊的系統的一部分,不會很快改變)。

我的問題是這樣的:是否有可能在code.h中的「// do something else」點設置一個斷點,以便您可以指定它是否是從alpha.c包含的實例或beta.c?如果是這樣,怎麼樣?

回答

2

認沽#define語句的主要文件:

// file alpha.c 
#define BREAK_FOR_ME 'A' 
void function_A() 
{ 
    int i; 
    #include "code.h" 
} 

// file beta.c 
#define BREAK_FOR_ME 'B' 
void function_B() 
{ 
    int i; 
    #include "code.h" 
} 

然後在code.h:

// file code.h 
for(i = 1;i < 10;i++) 
{ 
    // do some stuff 
    if (very_rare_event) 
    { 

    #ifdef BREAK_FOR_ME 
     switch (BREAK_FOR_ME) 
     { 
     case 'A': 
      // set breakpoint here... 
      break; 

     case 'B': 
      // or here... 
      break; 
     } 
    #endif 

     // do something else 
    } 
} 
+1

顯然,偉大的思想家都一樣! – 2010-01-12 19:09:36

+0

+1狡猾的開關使用。由於常量切換表達式可能會得到編譯器警告,但是如果您使用這樣的包含編寫代碼,我認爲編譯器警告可能是您最擔心的問題。 – 2010-01-12 19:11:33

+0

只有少數幾個文件被涉及時,這可能是確定的,並且您不想經常更改或添加斷點位置。但它不能太好 - 這太多了,你可能正在接近修復古怪編碼實踐的努力水平。 – 2010-01-12 20:51:50

0

好的,我想告訴你很多不同的方式,爲什麼你需要改變系統,但你已經表明你知道這不好,它不會改變,所以我會盡量避免這樣做。

你能不能做也許沿着這行的東西:

// file alpha.c 
void function_A() 
{ 
    int i; 
    const int foo = 1; 
    #include "code.h" 
} 

,並設置在code.h條件斷點與條件FOO == 1?做同樣的事情,但設置foo = 2爲功能B打破那裏。

0

function_Afunction_B中設置斷點,然後單步進入包含的代碼。然後您可以在需要的地方設置斷點。

這假定您已禁用大多數編譯器鏈接器優化。

0

使用#define在你的.c文件,並#ifdef S IN .h文件。在#ifdef內放置一些非操作(可能是遞增然後遞減計數器),然後在那裏設置斷點。請注意,您需要在那裏進行一些操作,因爲您只能在實際操作中設置斷點。

所以:

// file alpha.c 
#define FILE_ALPHA 
void function_A() 
{ 
    int i; 
    #include "code.h" 
} 
#undef FILE_ALPHA 

//file beta.c 
#define FILE_BETA 
void function_B() 
{ 
    int i; 
    #include "code.h" 
} 
#undef FILE_BETA 

// file code.h 
for(i = 1;i < 10;i++) 
{ 
    // do some stuff 
    if (very_rare_event) 
    { 
     // do something else 
     #if defined FILE_ALPHA 
      i++; //Set breakpoint here... 
      i--; 
     #elif defined FILE_BETA 
      i++; //...or here... 
      i--; 
     #else 
      i++; //...or here. 
      i--; 
     #endif 
    } 
} 
+0

哇,同步:) – egrunin 2010-01-12 19:08:19

0

因爲這樣的事情大概只需要很少,它可能不會支付弄清楚如何做到這一點的C源代碼級或通過一束籃球的跳。

所以,我可能只是看看我想要打入的函數的反彙編,並在彙編級別設置斷點。

作爲一個實驗,我在code.h設置斷點上線正常,調試器的斷點窗口顯示了斷點樹:

o code.h, line 9 
| 
+-- o code.h, line 9 
| 
+-- o code.h, line 9 

每個條目都可以被禁用。沒有簡單的方法找出哪一個對應於function_A(),哪個對應的是function_B(),只需看一下 - 我必須在啓用時運行該程序,並關閉我在第一次啓動時不感興趣的程序。考慮到情況可能有多少,這不是一個很好的可用性經驗,但也不是太令人驚訝。

如果你需要做到這一點更經常地,視覺C/C++應該讓你使用完全指定的斷點處"Context Operator"

{[function],[source],[module] } location 

,但我一直無法弄清楚如何實際在調試器IDE中使用此語法。如果有人有細節,我會很感激評論。

Debugging tools for Windows中的WinDBG也支持這種語法(或者類似的東西),但我不能確切地說明它(或者它是如何)在這個時刻工作的)。

相關問題