я запускаю этот код в Visual Studio 2013 (Debug конфигурации):Visual Studio многопоточных отладки
#include <thread>
#include <stdexcept>
void c() {
/* breakpoint here*/ throw std::runtime_error("error");
}
void b() {
c();
}
void a() {
b();
}
int main(int argc, char** argv) {
std::thread thr(a);
if (thr.joinable()) thr.join();
return 0;
}
Выполнение останавливается в точке останова, и я вижу Call Stack:
> DemoProj.exe!c() Line 5 C++
DemoProj.exe!b() Line 10 C++
DemoProj.exe!a() Line 16 C++
[External Code]
Это здорово ! Я точно вижу, где я нахожусь в процессе исполнения.
После этого я иду на один шаг (F10), чтобы выполнить эту линию исключения. Конечно, исключение брошено, но теперь мой Call Stack выглядит следующим образом:
> msvcp120d.dll!_Call_func$catch$0() Line 30 C++
msvcr120d.dll!_CallSettingFrame() Line 51 Unknown
msvcr120d.dll!__CxxCallCatchBlock(_EXCEPTION_RECORD * pExcept) Line 1281 C++
ntdll.dll!RcConsolidateFrames() Unknown
msvcp120d.dll!_Call_func(void * _Data) Line 28 C++
msvcr120d.dll!_callthreadstartex() Line 376 C
msvcr120d.dll!_threadstartex(void * ptd) Line 359 C
kernel32.dll!BaseThreadInitThunk() Unknown
ntdll.dll!RtlUserThreadStart() Unknown
Это делает мои отладки бесполезно. Линия
/* breakpoint here*/ throw std::runtime_error("error");
только здесь для этого простого примера. В реальном проекте я не буду знать, где код сломается. И было бы очень полезно, если Visual Studio могла остановить выполнение на точной строке, где произошла ошибка.
Но вместо этого, если исключение выбрасывается вне моего основного потока, я получаю только эти системные вызовы и никогда не могу понять, какая строка в моем коде вызывает сбои.
Любая помощь?
Я чувствую, что этот вопрос похож на this one. Идея заключается в том, чтобы перехватывать исключения в боковых нитях и передавать их в основной поток, чтобы основной поток мог повторно их выбросить. Разве нет еще более элегантного решения?
После того, как исключение уже было поймано, вы ничего не можете сделать. Стек уже размотано. Однако вы можете написать свой собственный класс исключений, который выгружает стек (прочитайте StackWalk64), прежде чем что-то бросать. https://msdn.microsoft.com/en-us/library/windows/desktop/ms680650(v=vs.85).aspx –
Отладчик обычно останавливается на необработанном исключении. Проблема в том, что она не обрабатывается. Вы видите код, который реализует требование о том, что вызов необработанных исключений заканчивается(). Это опасность std :: thread. Вам придется отлаживать этот вариант с помощью Debug> Exceptions> отметьте флажок Thrown для исключений C++. –
Что вы хотите видеть в отладчике? Учитывая F10 шагов по линии, и все готово. Вы спрашиваете, как поймать exeception на другом аэде? – doctorlove