GDB przy ustawionym breakpointcie freezuje

GDB przy ustawionym breakpointcie freezuje
Dawid90dd
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 6 lat
  • Postów:196
0

Witam.

Generalnie jeżeli chodzi o GDB, to kiedyś działał bez zarzutu, teraz działa tylko w pewnych sytuacjach. Kiedy ustawie breakpointa na poszczególnych funkcjach dosłownie się "zawiesza". I przez "zawiesza się" mam na myśli to co napisałem w tytule tego wątku. To znaczy - GDB jako proces mogę tylko zabić z poziomu menadzera zadań (ksysguarda w moim przypadku, bo siedze na linuxie). Utrzymuje swoje zużcie procesora na 16-17%,ntach, i dostep do aplikacji odzyskuje tylko kiedy zabije gdb.

W wielu sytuacjach kiedy ustawiam breakpointa, wszystko jest ok, ale zauważyłem że kiedy ustawiam breakpoint na funkcjach renderujących różne grafiki, to w wielu przypadkach następuje ta sytuacja z freezem. Teraz dla testów ustawiłem breakpoint na funkcji RenderSprite(), za każdym razem mi na niej freezuje. Wiem, że znalazłbym też wiele podobnych funkcji.

Nie mam pojęcia jak to zdiagnozować, gdb jak freezuje to się zachowuje tak, jakby był w pętli nieskończonej, nie da się nic z nim zrobić, można go jedynie zabić.

Miał ktoś do czynienia z podobną sytuacją?
Wrzucam logi z gdb które znalazłem w /tmp/
Widać tam troche ścieżek do moich plików, i nazw różnych funkcji... ale chyba to przeżyje (http://pastebin.com/zW9fBANR)

wersja gdb - GNU gdb (Ubuntu 7.8-1ubuntu4) 7.8.0.20141001-cvs

Dodam, że debuguje w netbeansie.

EDIT: Tak generalnie wygląda callstack wywołania tej funkcji:

Core::Core() ->
Core::Loop() ->
Graphics::DrawLoop() ->
Game::renderObjects() ->
Building::Render() -> (ta funkcja jest konkretyzowana w klasach Building, Ship dziedziczace po Entity)
EntityRender::RenderSprite() (Building dziedziczy po Entity, Entity dziedziczy po EntityRender)

Tak wygląda uproszczony model Buildingu (jest jeszcze Ship, Asteroid... ale pomińmy to)

Kopiuj
class EntityProporties {
    public:
    int x;
    int y;
    sf::Sprite sprite;
    //......
}
class EntityRender : virtual public EntityProporties {
    public:    
    virtual void Render() = 0;
    void RenderSprite();
    //....
}
class EntityTransform : virtual public EntityProporties {//......}
class EntityActivity : virtual public EntityProporties {//......}

class Entity : public EntityTransform, public EntityRender, public EntityActivity, virtual public EntityProporties {
public:

//.....
}

class Building : Entity {
public:
    void Render();
//......
}

//....gdzies tam w pliku cpp
Building::Render() {
   RenderCostam1();
   RenderCostam2();
   //....
    RenderSprite();
   //....
}
edytowany 2x, ostatnio: Dawid90dd
stryku
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:607
0

A może gdb --args gdb gra? (:

PR
A jak to sie ma do jego problemu? :D
Dawid90dd
gdb ./stryku, a potem kill.
stryku
jakieś rozwiązanie to jest
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A jesteś pewien ze wisi? Bo rozumiesz że instrumentacja przez gdb "kosztuje", prawda? Tzn kod pod debugerem działa wolniej, a w pewnych sytuacjach wyraźnie wolniej. Bardzo możliwe że masz właśnie taką sytuację, że twoje renderowanie normalnie śmiga szybko bo np. całe leci gdzieś na GPU, ale jak masz debuger włączony i próbkowanie wszystkich zmiennych i parametrów to niestety ale przestaje to być możliwe.
Eclipse CDT ma nakładkę na gdb i wydaje mi się że miała opcje "pauzowania" procesu, tzn debuger zatrzymuje od razu wykonanie i pokazuje ci w którym miejscu znajduje sie instruction pointer.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Dawid90dd
Nie nie nie, to nie to, gdb dosłownie się zawiesa, i nic nie można z nim zrobić, jak próbuję pauzować gdb w netbeansie czy wykonywać różne akcje, czy przez konsole gdb coś robić to nic to nie daje.
Dawid90dd
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 6 lat
  • Postów:196
0

Testowałem teraz debugowanie przez konsole, jednak przez konsole na czysto działa. Ustawiam breakpoint, jest breakpoint. Tam gdzie mi się normalnie przez gdb netbeans crashuje. Tylko w netbeansie występuje ta głupia sytuacja. netbeans przesyła do gdb więcej komend niż ja (można zobaczyć sobie w logsach powyżej), może one mają na to jakiś wpływ?

nagrałem na szybko film żeby pokazać jak to wygląda, mam nadzieje że nie jest to w żaden sposób zabronione, a jeżeli jest to proszę moderatora o zlinczowanie.

YU
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 6 lat
0

Skoro jest to problem edytora to zmień edytor. Zobacz jak to wygląda np. pod Eclipse/QtCreator.


Dawid90dd
No nie, to odpada. Definitywnie.
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 3 lata
  • Postów:1493
0

A. Napisz sobie skrypt do gdb.
B. Netbeans ma logowanie tego co przechodzi przez gdb (komendy, odpowiedzi itd.)? Jeśli tak: włącz i spróbuj odtworzyć to spod konsoli, gdzie ponoć działa. Może jakaś konkretna komenda robi Ci kuku.

BTW - jak ubijesz zwieszone IDE to gdb dalej "żyje"? To jest lokalny debug czy jakiś gdbserver, do którego możesz podpiąć się telnetem?

Dawid90dd
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 6 lat
  • Postów:196
0
alagner napisał(a):

A. Napisz sobie skrypt do gdb.
B. Netbeans ma logowanie tego co przechodzi przez gdb (komendy, odpowiedzi itd.)? Jeśli tak: włącz i spróbuj odtworzyć to spod konsoli, gdzie ponoć działa. Może jakaś konkretna komenda robi Ci kuku.

....

Dawid90dd napisał(a):

Wrzucam logi z gdb które znalazłem w /tmp/
(...) (http://pastebin.com/zW9fBANR)

A co do tego by odworzyć to co netbeans robi.. to może być dobry pomysł, zaraz spróbuje.

alagner napisał(a):

BTW - jak ubijesz zwieszone IDE to gdb dalej "żyje"? To jest lokalny debug czy jakiś gdbserver, do którego możesz podpiąć się telnetem?

Nie wiem zielonego pojęcia co masz na myśli z tym "lokalnym debugiem", "telnetem" i "gdbserverem"...

edytowany 3x, ostatnio: Dawid90dd
PR
bo gdb da sie debugować zdalnie i sie podpiać po prostu jakimś np gui do serva, przykład debugowanie emulatorów jak bochs, bochs stawia serva i sie tylko podpinasz gdb. poczytaj o zdalnym debugowaniu. być może netbeans stawia serva.
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 3 lata
  • Postów:1493
0

Przeoczyłem loga, przepraszam :) Tak czy siak tam nie zajrzę, mamy w pracy dość mocno poblokowany internet.

W temacie gdb servera https://sourceware.org/gdb/onlinedocs/gdb/Server.html
Ale z tego co widzę na pierwszy rzut oka to raczej prosto wykonalne nie będzie.

Dawid90dd
Nie ma sprawy. Co do tego gdb- Teraz sprawdziłem, przy zamknięciu netbeansa gdb z aplikacją nadal działają.
AL
@Dawid90dd To strzał na wyczucie, ale na moje oko to wiesza się coś ma linii netbeans-gdb ale po stronie IDE. Takie jaja też bywają w Eclipsie kiedy zdarzy się coś totalnie nieprzewidywalnego.
Dawid90dd
@alagner Być może tak, ale nie będę gdybać, postaram się potem zrobić tak jak mówiłeś - sprawdze jakie komendy netbeans podaje do gdb, i postaram się odtworzyć je przez konsole. Tylko że teraz mam trochę mniej czasu na to, myśle że zajme się tym dopiero wieczorem.
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)