Stacktrace w release bez pliku .pdb

1

Witam,
napisałem klasę wyjątku ze stacktracem (boost::stacktrace) do projektu w C++ na WinAPI. Działa w release dopóki plik wykonywalny jest w katalogu razem z wygenerowanym plikiem .pdb. Jeśli przeniosę plik wykonywalny do innego katalogu (gdzie nie ma .pdb), stacktrace staje się nieczytelny:

 0# 0x00007FF781D046EC in Wiadomosc
 1# 0x00007FF781D03FB0 in Wiadomosc
 2# 0x00007FF781D043A8 in Wiadomosc
 3# 0x00007FF781D114CA in Wiadomosc
 4# BaseThreadInitThunk in KERNEL32
 5# RtlUserThreadStart in ntdll

Problem jest taki, że zależy mi żeby plik wykonywalny nie potrzebował innych plików do poprawnego funkcjonowania, więc nie mogę deployować z tym .pdb.
Czy da się jakoś zamienić te adresy na nazwy funkcji dysponując kodem źródłowym albo użyć innej biblioteki do stacktracea żeby to działało?
Nie znam się dobrze na tym, więc niewykluczone, że jest to niemożliwe do osiągnięcia...

0

no ale do tego właśnie służą pliki pdb, w .exe nie ma informacji o nazwach funkcji.
Zamiast stacktrace lepiej zrobić memorydump a potem lokalnie posiadając odpowiednie pdb możesz przeanalizować stacktrace i cały stan aplikacji.
Google podpowiada że opcja /Z7 kompilatora spowoduje włączenie symboli do .execa ale nie wiem

0

@obscurity: czyli chyba za bardzo nie ma jak tego stacktracea zrobić. Spróbowałem /Z7, ale efekt jest taki sam. Na SO piszą, że debugging information jest w .obj, ale w .exe już nie. Przyjrzę się memory dumpowi.

0

Możesz lokalnie załadować ten stacktrace do debuggera i po załadowaniu .pdb powinno przetłumaczyć adresy funkcji na nazwy i linijki w kodzie. Jeśli chcesz mieć ładnie po stronie usera to istnieje możliwość po prostu załączenia .pdb jako resource do .exe i wypakowania go. Powinna być możliwość określenia w runtime lokalizacji plików pdb i wypakowania ich do tempa jeśli nie chcesz mieć go obok aplikacji. Google mówi że wystarczy ustawić zmienną środowiskową _NT_SYMBOL_PATH

0
michal19937 napisał(a):

Witam,
napisałem klasę wyjątku ze stacktracem (boost::stacktrace) do projektu w C++ na WinAPI.

https://4programmers.net/Forum/C_i_C++/368641-stacktrace_dla_aplikacji_windows_ale_nie_skompilowanej_w_msvc?p=1914109#id1914109

Ergo spróbuj z flagami takimi jak ja ustawiłem.

0

Możesz lokalnie załadować ten stacktrace do debuggera i po załadowaniu .pdb powinno przetłumaczyć adresy funkcji na nazwy i linijki w kodzie.

@obscurity: Brzmi dobrze, ale nie mam pojęcia jak załadować stacktrace do debuggera. Szukałem, ale znalazłem tylko coś o ładowaniu dump filea. Wiesz jak to zrobić? Używam Visual Studio 2022 Community.

Jeśli chcesz mieć ładnie po stronie usera to istnieje możliwość po prostu załączenia .pdb jako resource do .exe i wypakowania go.

Nie musi być ładnie, wystarczy żeby działało.

0

@MarekR22: Tam działa, bo jest obecny .pdb, ale jak zdeployuję to go nie będzie.

0

Nie da się mieć ciastka i zjeść ciastka. pdb jest niezbędny do zamiany adres ➡ ładna nazwa. Możesz zamiast printować stacktrace zapisać plik minidump (np. używając biblioteki crashpad/breakpad lub MiniDumpWriteDump z WinAPI) i otworzyć go wraz z plikiem .pdb w debuggerze, np. MSVS.

1 użytkowników online, w tym zalogowanych: 0, gości: 1