Konfiguracja "post-mortem debugging"

Konfiguracja "post-mortem debugging"
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2067
1

Chciałbym aby w momencie gdy aplikacja zaliczy crash automatycznie uruchomił się debugger gdzie mógłbym obejrzeć co się wydarzyło. Aplikacja skompilowana w msys2+clang16.0.5 (Windows)

Moje eksperymenty:
[1]
QtCreator i opcja Edit > Preferences > Debugger > General > Use Qt Creator for post-mortem debugging.
W momencie wyjatku uruchamia się QtCreator tylko że domyslnie jest CDB a nie GDB wiec symboli gdb nie czyta

[2]
Trochę błądzę ale umiem uruchomić windbg.exe
https://learn.microsoft.com/en-us/windows/win32/debug/configuring-automatic-debugging#configuring-automatic-debugging-for-application-crashes
windbg też nie rozumie symboli gdb ale sukcesem jest że wiem gdzie to jest w rejestrach :D

[3]
Tutaj znalazłem opis jak zarejestrować gdb
https://www.msys2.org/wiki/JIT-Debugging/
ale to też nie działa poprawnie bo zamiast GDB uruchamia się jakieś okno (chyba wiersz poleceń) ktore ma zablokowana kolejkę komunikatów, jak je zamknę to uruchomi sie okno GDB ale nie jest połączone z martwa aplikacją


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
KS
  • Rejestracja:prawie 4 lata
  • Ostatnio:4 dni
  • Postów:581
0

co rozumiesz przez crash ?
Możesz zawsze wyłączyć/obsłużyć sobie segfaulta, bo to tylko sygnał. Nie wiem jak jest na windows, taka wskazówka tylko.

AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:około rok
  • Postów:3561
0
ksh napisał(a):

co rozumiesz przez crash ?
Możesz zawsze wyłączyć/obsłużyć sobie segfaulta, bo to tylko sygnał. Nie wiem jak jest na windows, taka wskazówka tylko.

Na mainframach w fortranie, paaaaaanie to było postmortem, niii to co teraz młode robiom
Robiło się dzielenie przez zero (kompilacja debug) i spowiadał się ze zmiennych

Ale już bardziej serio: @Marius.Maximus
Decydując sie na kompilację Debug masz większe szanse, pytanie czy chcesz mieć Debug na produkcji.


Bo C to najlepszy język, każdy uczeń ci to powie
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2067
0
Kopiuj
            auto crash_example = [](){
                char * foo = nullptr;
                *foo = 42;
            } ;

Nie wiem jak pod Windows kompilując kompilatorem clang z msys2 ogarnąć tego typu sytuacje.
Pod Linux mogę to oprogramować reagując na odpowiedni sygnał , działa tez fsanitize
Po Windows nie działa mi fsanitize w polaczeniu z Qt wiec szukam alternatywnej drogi na zbadanie dlaczego aplikacja zakończyła przedwcześnie swój żywot

Ideałem było by podobne rozwiązanie jak w Delphi

Kopiuj
  procedure crash_example;
  var
    foo:PChar;
  begin
    foo := nil;
    foo^ := #42;
  end;

W Release wywolanie funkcji crash_example mam to oprogramowane w postaci komunikatu
screenshot-20230616083133.png

czyli wyszedł problem XY ;)


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
GO
  • Rejestracja:około 2 lata
  • Ostatnio:ponad rok
  • Postów:141
2

A nie możesz w tym rejestrze zamiast windbg.exe" -p %ld -e %ld -g wpisać powershell" -Command "gdb -p %ld" , ewentualnie terminal windows lub cmd i w nim gdb z attachem pod pid.

Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2067
0

w rejestrze mogę wpisać zamiast windbg dowolną aplikację

np. C:\msys64\clang64\bin\gdb -p %ld

I gdb sie uruchamia

Kopiuj
[New Thread 28192.0x6738]
[New Thread 28192.0x28ec]
[New Thread 28192.0x24ac]
[New Thread 28192.0x6064]
[New Thread 28192.0x68cc]
Reading symbols from C:\Users\X\Desktop\gity\bin\app3.exe...
(gdb)

tylko nie mam zielonego pojęcia jak obsługiwać gdb z linii polecen.


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
RE
  • Rejestracja:ponad 18 lat
  • Ostatnio:21 minut
1

Chciałbym aby w momencie gdy aplikacja zaliczy crash automatycznie uruchomił się debugger gdzie mógłbym obejrzeć co się wydarzyło.

nie możesz sobie core dump wygenerować, i obejrzeć później?


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
Marius.Maximus
mogę prosić o podpowiedz jak to zrobić na Windows ?
RE
niestety nigdy na windows tego nie robiłem(w zasadzie nigdy zawodowo nie tworzyłem softu na windows). Możesz spojrzeć na stack i ewentualnie na chatgpt. Ale analizowąłem tak zrzuty z softu czy nawet unit testów.
GO
@Marius.Maximus: nie możesz w gdb tego stacktrace zobaczyć, będziesz widział jak program się wykonywał, masz na stosie wszystkie zmienne lokalne możesz podglądnąć, crash w momencie np. seg to jak odwołujesz się do adresu null pointer lub do strony, która nie jest przydzielona, a to łatwo wykryć.
GO
  • Rejestracja:około 2 lata
  • Ostatnio:ponad rok
  • Postów:141
3

@Marius.Maximus: Pora się nauczyć :P

Ale nie jest jakoś trudno, tryb graficzny włączasz wpisując tui enable
masz poruszanie się za pomocą n,s, ni, si, gdzie masz odpowiednio następna linia kodu, lub następna instrukcja i masz też następna instrukcja, ale jak funkcja to wejdź w nią itp.
Jak użyjesz jednej to potem możesz F7, F8 wciskać.

Jak włączysz TUI to wyświetli ci się kod źródłowy i możesz iterować linia po linii.
Jak breakpoint chcesz ustawić to break *address lub break main.c:35 co powinno ustawić na 35 lini breakpoint w main.c pliku.

display/10i $rip będzie ci co każdy krok w gdb wyświetlać 10 instrukcji assemblera
dissassembly-flavor intel zmieni assembly na intela

help to masz pomoc
info reg
info line *0xaddress

wyświetlanie i konwersje masz z C, p (char*)$rax jeśli w rax był wskaźnik na stringa, to rzutujesz go na typ char* pointer i print func.
Jak masz symbole debuggera to bezpośrednio do zmiennych można się odwoływać, a nie poprzez adresy i rejestry.

backtrace lub bt 10 do wyświetlania stack trace.

Można też skryptować w pythonie, ale trochę do poczytania.
https://sourceware.org/gdb/onlinedocs/gdb/Python-API.html#Python-API

edytowany 3x, ostatnio: GodOfCode.
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2067
2

Sprawdziłem "Use Qt Creator for post-mortem debugging" na projekcie skompilowany w Visual studio , i tutaj wszystko działa idealnie
Wywołanie "crash_example() " powoduje uruchomienie QtCreator i jestem w miejscu wyjątku.
Czyli wszystko działa pięknie w QtCreator jak jest odpowiedni kompilator :D


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2067
0

@GodOfCode gdy JIT-Debugging skonfiguruje dla GDB to mogę obejrzeć wszystkie watki ale nie mam informacji w którym wątku był wyjątek,jak obejrzę watki to mogę znaleźć miejsce na podstawie funkcji w okolicy np.:

w #11 jest mój wyjątek
zawsze jest uruchamiane 'KiUserExceptionDispatcheriRtlRaiseException`

Kopiuj
(gdb) thread 1
[Switching to thread 1 (Thread 20108.0x69d8)]
#0  0x00007fff6452dc04 in ntdll!ZwWaitForMultipleObjects () from C:\Windows\SYSTEM32\ntdll.dll
(gdb) bt
#0  0x00007fff6452dc04 in ntdll!ZwWaitForMultipleObjects () from C:\Windows\SYSTEM32\ntdll.dll
#1  0x00007fff62021b40 in WaitForMultipleObjectsEx () from C:\Windows\System32\KernelBase.dll
#2  0x00007fff62021a3e in WaitForMultipleObjects () from C:\Windows\System32\KernelBase.dll
#3  0x00007fff63bf0eba in WerpLaunchAeDebug () from C:\Windows\System32\kernel32.dll
#4  0x00007fff63bf08f6 in WerpLaunchAeDebug () from C:\Windows\System32\kernel32.dll
#5  0x00007fff620fdf99 in UnhandledExceptionFilter () from C:\Windows\System32\KernelBase.dll
#6  0x00007fff64535570 in ntdll!memset () from C:\Windows\SYSTEM32\ntdll.dll
#7  0x00007fff6451c8c6 in ntdll!__C_specific_handler () from C:\Windows\SYSTEM32\ntdll.dll
#8  0x00007fff6453247f in ntdll!.chkstk () from C:\Windows\SYSTEM32\ntdll.dll
#9  0x00007fff644e14f4 in ntdll!RtlRaiseException () from C:\Windows\SYSTEM32\ntdll.dll
#10 0x00007fff64530f8e in ntdll!KiUserExceptionDispatcher () from C:\Windows\SYSTEM32\ntdll.dll
#11 0x00007ff72763f3f5 in Menu::Menu(QWidget*)::$_44::operator()() const::{lambda()#1}::operator()() const (this=0xee4b2fb688) at C:/Main.cpp:888

--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
edytowany 3x, ostatnio: Marius.Maximus
GO
  • Rejestracja:około 2 lata
  • Ostatnio:ponad rok
  • Postów:141
2

Ja bym to zrobił tak:

Można złapać tego throw jeśli to był rzucony z c++, ale widzę że nie ma __cxa_throw, to jest jakiś inny chyba exception.

Tak można złapać go na catch throw i potem zrobić w gdb run.

Nawet jak nie złapiesz to też tam pies, można ustawić breakpoint na KiUserExcepitonDispatcher, ale nawet bez ustawiania breakpointa można sobie poradzić.
Powinien automatycznie się ustawić thread, który został złapany na breakpoint lub tym exceptionie.

Teraz tak jak zrobisz bt to jesteś pod adresem 0x00007fff6452dc04 funkcji na tej ramce stosu.
jak zrobisz up to przejdziesz ramkę do góry, musisz wejść do ramki 0x00007ff72763f3f5 czyli możesz też od razu up 11 gdyż ( #11 0x00007ff72763f3f5 in Menu) powinno wypisać się kod źródłowy main.cpp:888

lub możesz ręcznie wypisać, list *0x00007ff72763f3f5 to powinno wypisać kod źródłowy ewentualnie list main.cpp:888 nie idzie się przesuwać w tym kodzie źródłowym to odpal sobie tui enable teraz strzałkami można sobie zobaczyć jak wygląda.

Jak za pomocą tego up lub down idziesz jedną ramkę do góry i na dół to jak ustawisz odpowiednią ramkę to możesz zmienne w tej ramce wypisywać po nazwie np. p zmienna_int.

Ogólnie tutaj już musisz popatrzeć czemu jakiś warunek został spełniony, że akurat tędy poszło wykonanie programu.

GO
  • Rejestracja:około 2 lata
  • Ostatnio:ponad rok
  • Postów:141
2

Napisz czy poradziłeś sobie jak coś to mogę wbić na remote desktop lub udostępnisz remote debugging i ci pomogę to zdebugować.

Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2067
0

Wszystko jest banalnie proste jak już wiesz jak to zrobić :)
Jak dodam w clang generowanie CodeView i wygeneruje pdb to wszystko po prostu działa w każdym windowsowym narzędziu


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)