Отладка функций Visual Studio - PullRequest
       20

Отладка функций Visual Studio

1 голос
/ 15 апреля 2011

Я работаю над VS 2008 . Я хочу получить следующую информацию для всех моих методов:

1) Время при поступлении звонка

2) Время на выходе из вызова и возвращаемое значение.

GDB позволяет мне устанавливать точку останова при каждом входе в функцию и выходить из нее, запускать сценарий в точке останова и затем продолжать отладку. Я устал искать решения, чтобы сделать что-то похожее на VS. Я даже думал о написании сценария для анализа всего моего кода и написания fprintf при входе и выходе, но это очень сложно. Отчаянно ищу помощи.

Ответы [ 4 ]

2 голосов
/ 15 апреля 2011

используя windbg, вы также можете установить для каждой записи функции и запустить скрипт.Например, следующая команда добавит точку останова ко всем функциям вашего модуля, отобразит название функции, текущее время, запустится до выхода из функции, отобразит время и продолжит.

bm yourmodule!* "kcL1;.echotime;gu;.echotime;gc"
1 голос
/ 15 апреля 2011

Полагаю, вы подаете в суд на c ++.Вы можете определить класс трассировки времени, который отображает метки времени

/* define this in a header file */
class ShowTimestamp {
private:
    static int level_;   // nested level for function call tree

private:
    const char *func_;
public:
    ShowTimestamp(const char* f) : func_(f) {
        std::cout << func_ << ":" << (level_++) << ":begin\t" << GetTickCount64() << std::endl;
    }

    ~ShowTimestamp() {
        std::cout << func_ << ":" << (--level_) << ":end\t" << GetTickCount64() << std::endl;
    }
};

#ifndef NO_TRACE_TIMER
  #define TIMESTAMP_TRACER     ShowTimestamp _stt_(__FUNCTION__); 
#elif
  #define TIMESTAMP_TRACER
#endif

Уровень_ должен быть объявлен в файле CPP отдельно.

// You need to define the static member in a CPP file         
int ShowTimestamp::level_ = 0;

В своем коде вы можете сделать

int Foo(int bar) {
  TIMESTAMP_TRACER 

  // all the other things.
  ......

  return bar;
}

Если вы больше не хотите отслеживать таймер, вы можете просто определить NO_TRACE_TIMER

1 голос
/ 15 апреля 2011

Visual Studio не подходит для этого; вам придется использовать WinDbg. Он имеет свой собственный язык сценариев, который позволит вам делать то, что вы ищете. К сожалению, я не знаю в первую очередь о его языке сценариев; вам придется прочитать файл справки (который на самом деле более или менее полезен, на этот раз).

1 голос
/ 15 апреля 2011

По сути, это функциональный уровень профилирования по времени (TBP). В этом вам могут помочь несколько инструментов:

Я предлагаю вам сначала попробовать AMD CodeAnalyst. Если у вас нет версии Visual Studio Premium или Ultimate.

...