Могу ли я установить точку останова во включенном коде? - PullRequest
1 голос
/ 12 января 2010

У меня есть нечто похожее на следующие фрагменты кода:

// 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 в точке «// сделать что-то еще» таким образом, чтобы вы могли указать, является ли это экземпляром включения из alpha.c или beta.c? И если да, то как?

Ответы [ 5 ]

2 голосов
/ 12 января 2010

Поместите #defines в основные файлы:

// 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
    }
}
0 голосов
/ 12 января 2010

Поскольку что-то подобное, вероятно, требуется очень редко, вероятно, не стоит выяснять, как это сделать на уровне исходного кода C или перепрыгивать через кучу обручей.

Итак, я бы, вероятно, просто посмотрел на разборку функции, которую я хотел взломать, и установил точку останова на уровне сборки.

В качестве эксперимента я обычно устанавливаю точку останова на строке в code.h, и окно точки останова отладчика отображалось с деревом точек останова:

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

Каждая запись может быть отключена. Не было простого способа выяснить, какой из них соответствует function_A(), а какой для function_B(), просто посмотрев - мне пришлось запустить программу с обоими включенными и отключить тот, который мне не был интересен, когда он был первый удар Не очень хороший опыт использования, но не слишком удивительно, учитывая, насколько редкой может быть ситуация.

Если вам нужно делать это более регулярно, Visual C / C ++ должен позволить вам полностью указать точку останова, используя «Оператор контекста» :

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

но я не смог понять, как на самом деле использовать этот синтаксис в IDE отладчика. Если у кого-то есть подробности, я буду признателен за комментарий.

WinDBG в Средствах отладки для Windows также поддерживает этот синтаксис (или что-то очень похожее), но я не могу точно проверить, как (или если) он работает в данный момент).

0 голосов
/ 12 января 2010

Используйте #define s в ваших .c файлах и #ifdef s в .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 голосов
/ 12 января 2010

Установите точку останова в function_A или function_B, затем перейдите к включенному коду. Затем вы можете установить точку останова там, где вам это нужно.

Предполагается, что вы отключили большинство компиляторов и оптимизации компоновщика.

0 голосов
/ 12 января 2010

Хорошо, я хотел бы рассказать вам по-разному, почему вам нужно изменить систему, но вы указали, что знаете, что это нехорошо, и что это не изменится, поэтому я попробуювоздерживаться от этого.

Не могли бы вы сделать что-то вроде этого:

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

и установить условную точку останова в code.h с условием foo == 1?Сделайте то же самое, но установите foo = 2, чтобы функция B сломалась там.

...