Я видел из 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()
требует порождения нити. Если вызвать слишком много, это снизит производительность приложения.
По умолчанию, TRACE
звонки OutputDebugString
,
Вы могли бы использовать DebugView, который захватывает OutputDebugString
вывод и имеет возможность записать его в файл.
Кажется, невозможно напрямую отправить вывод в файл, кроме как путем изменения приложения, например, перехватывая вывод с _CrtSetReportHook2
.
Внутри МФЦ использует _CrtDbgReport
вывести его TRACE
Сообщения. Ты можешь позвонить _CrtSetReportMode
указать, куда должен выводиться его вывод. Сделав это, вы можете позвонить _CrtSetReportFile
указать дескриптор файла win32 (как возвращается CreateFile
).