Как можно перенаправить операторы TRACE в MFC, чтобы уменьшить поток данных из AfxDumpStack ()?

Я видел из AfxDumpStack что можно перенаправить TRACE выход.

  • AFX_STACK_DUMP_TARGET_TRACE Отправляет вывод с помощью макроса TRACE. TRACE макрос генерирует вывод только в отладочных сборках; он не генерирует вывод в сборках релиза. Также, TRACE может быть перенаправлен на другие цели, кроме отладчика.

Курсив мой.

Я программирую на C ++ из старого приложения и хотел бы сбросить часть стека с помощью AfxDumpStack() который только выводит на TRACE или буфер обмена. Я хочу вывести только несколько строк, поэтому мне нужно обработать строку перед выводом.

Как бы я сделал это самым простым способом?

РЕДАКТИРОВАТЬ

Так вот код для моего решения:

class hook
{
public:
hook()
{
VERIFY(_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, Hook) != -1);
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, INVALID_HANDLE_VALUE);
}
~hook()
{
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG);
VERIFY(_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, Hook) != -1);
}
static const size_t max_backtrace = 4;    // max calls to view
static const size_t skip_stack_head = -5; // skips over calls related to AfxDumpStack()
static size_t line;                       // current line being output from begin of stack dump
static bool stack_out;                    // currently outputting stack dump
static int Hook( int reportType, char *message, int *returnValue )
{
if (strcmp(message, "=== begin AfxDumpStack output ===\r\n") == 0)
{
stack_out = true;
line = skip_stack_head;
}
else if (strcmp(message, "=== end AfxDumpStack() output ===\r\n") == 0)
{
OutputDebugString("\r\n");
stack_out = false;
}
else
{
if (strcmp(message, "\r\n") == 0) // AfxStackDump() sends CRLF out on separate calls
{
if (!stack_out || line < max_backtrace-1)
{
OutputDebugString("\r\n\t");
}
++line;
}
else if (!stack_out || line < max_backtrace)
{
OutputDebugString(message);
}
}
return TRUE;
}
};
size_t hook::line     = -1;
bool   hook::stack_out = false;

static hook junk;

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

1

Решение

По умолчанию, TRACE звонки OutputDebugString,

Вы могли бы использовать DebugView, который захватывает OutputDebugString вывод и имеет возможность записать его в файл.

Кажется, невозможно напрямую отправить вывод в файл, кроме как путем изменения приложения, например, перехватывая вывод с _CrtSetReportHook2.

Внутри МФЦ использует _CrtDbgReport вывести его TRACE Сообщения. Ты можешь позвонить _CrtSetReportMode указать, куда должен выводиться его вывод. Сделав это, вы можете позвонить _CrtSetReportFile указать дескриптор файла win32 (как возвращается CreateFile).

4

Другие решения


По вопросам рекламы [email protected]