Autor Wątek: Visual C++ - debugger wchodzi do źródeł biblioteki standardowej  (Przeczytany 9129 razy)

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Maj 03, 2007, 13:26:27
Kiedy debugujemy program w Visual C++ za pomocą pułapek (breakpoint) i pracy krokowej oraz chcemy wejść do wnętrza jakiejś funkcji (Step Into - F11), debugger często wchodzi do kodu źródłowego biblioteki standardowej C++ czy Boost, np. do nagłówków takich jak vector, xstring czy xtree. To jest denerwujące, bo trzeba wiele razy wychodzić Ctrl+F11 i jeszcze raz wchodzić F11 zanim trafi do kodu mojej funkcji którą wywołuję - albo postawić pułapkę na początku wnętrza tej funkcji.

Moje pytanie jest takie - czy da się ustawić coś, żeby debugger poruszał się wyłącznie po kodzie mojego projektu, bez zaglądania do biblioteki standardowej C++ albo wszelkich bibliotek zewnętrznych? A może jest na to jeszcze inny sposób?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Maj 03, 2007, 14:10:17
Skasować źródła CRT? :) Tak tylko strzelam, nigdy nie próbowałem czegoś z tym zrobić, chociaż i mnie to niezmiernie wkurza.

//EDIT:
W sumie jeszcze sensowniej byłoby skasować plik *.pdb dla tego run-time'a, którego akurat używasz. Wtedy debugger na pewno nie wejdzie do źródeł RT.
« Ostatnia zmiana: Maj 03, 2007, 14:18:10 wysłana przez Złośliwiec »

Offline Kwazar

  • Użytkownik

# Maj 03, 2007, 16:41:28
Reg nie wiem czy dobrze cię zrozumiałem ale ja to robię tak:

// gdy mam jakąś funkcję biblioteczną np cin:
cin >> zmienna;     // to naciskam F10 czyli "Step Over"
// Debuger nie śledzi tej funkcji i przechodzi o linijkę niżej

// gdy mam jakąś swoją funkcję:
Rysuj();     // chcę zobaczyć jak działa to naciskam F11
// Debuger "wchodzi" do funkcji czyli jest wszystko ok

// Gdy jest taka sytuacja:
cout << Wypisz();
// To poprostu robię enter pomiędzy funkcjami
cout <<
Wypisz();
// i wciskam F11 przy funkcji Wypisz()


Nie napisałeś z jakiego dokładnie IDE korzystasz moje środowisko to VC++ Express edition 2005

Offline Xion

  • Redaktor
    • xion.log

# Maj 03, 2007, 16:44:07
Kwazar: Prawdopodobnie chodzi o coś takiego:

1. Mamy np. taką funkcję:
void Foo(const std::string& str);
2. Wywołujemy ją:
Foo ("arfbdefggrghble")'
3. Gdy będziemy chcieli wejść do ciała tej funkcji, debugger wpierw poczęstuje nas konstruktorem basic_string (bo string to basic_string<char>), tworzącym napis będący argumentem funkcji, z nagłówka string.

Offline Kwazar

  • Użytkownik

# Maj 03, 2007, 16:57:52
Xion: Napisałem prosty programik na podstawie tego co napisałeś i podczas dubugowania było wszystko ok debuger przeszedł od razu do ciała mojej funkcji bez wchodzenia do klasy std::string :).

Reg: opisz dokładniej swój problem.
« Ostatnia zmiana: Maj 03, 2007, 17:00:09 wysłana przez Kwazar »

Offline mINA87

  • Użytkownik

# Maj 03, 2007, 17:18:31
Xion: Napisałem prosty programik na podstawie tego co napisałeś i podczas dubugowania było wszystko ok debuger przeszedł od razu do ciała mojej funkcji bez wchodzenia do klasy std::string :).

Reg: opisz dokładniej swój problem.

Może w tym przypadku tak, ale oddaje on sytuację.
Ostatnio widziałem coś takiego jak debugowałem wywołanie metody w której parametrem był obiekt pobierany z std::vector poprzez operator[].
W ogóle fajnie by było móc jakoś oznaczać sekcje kodu do których debugger ma nie wchodzić.
//edit:
Ha - znalazłem x]
http://www.codeguru.com/cpp/v-s/devstudio_macros/debugging/article.php/c3207/
Teraz trzeba to przetestować pod najnowszymi Visualami.
//edit2:
Więcej fajnego stuff'u:
http://blogs.msdn.com/andypennell/archive/2004/02/06/69004.aspx
http://through-the-interface.typepad.com/through_the_interface/2006/07/advanced_visual_1.html
Z tego co pobieżnie przejrzałem artykuły, to w VC8.0 ustawia się toto w rejestrze i można nawet użyc qyrażeń regularnych!! :]
Super - poświęcę chwilę i z głowy będę miał wchodzenie w ciała metod Singletonów czy szablonów z stl'a :]
« Ostatnia zmiana: Maj 03, 2007, 17:25:52 wysłana przez mINA87 »

Offline Xion

  • Redaktor
    • xion.log

# Maj 03, 2007, 18:29:55
No ładnie i pięknie, ale w sumie szkoda że nie istnieje coś takiego jak #pragma debug(skip) na oznaczenie obszarów kodu, do których śledzenie nie powinno wchodzić. Coś na kształt .nolist i .list z MASMa (oczywiście o nieco innym przeznaczeniu). Cóż, pomarzyć zawsze można, a i przynajmniej MS ma coś ciekawego do dodania w kolejnych wersjach VS ;)

Kwazar: Tak, to był tylko przykład, nie testowałem go, ale chodziło tylko o ukazanie idei problemu.

st3tc

  • Gość
# Maj 03, 2007, 18:33:01
Heh działa pięknie :). Thx mINA87 :)

Offline mINA87

  • Użytkownik

# Maj 03, 2007, 18:47:09
Spx :]
Hmm a może by tak machnąć jakiś plugin do tego w Visualu? :>
Bo Twoje rozwiązanie Xion jest trochę hardcorowe - zobacz jakby to kod pocięło, ale z drugiej strony zrobić GUI w którym podczas debugowania możnaby kliknąć na klasę/szablon/metodę i wybrać "do not enter" to byłoby super po prostu :] Najfajniej by było jakby to się dało jeszcze modyfikować per-project i zapisywać gdzieś na boku, ale tutaj to już hack porządniejszy albo właśnie miejsce w którym M$ może się wykazać :)

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Maj 04, 2007, 11:43:57
Tak, oczywiście chodziło mi sytuację w kodzie, kiedy coś dzieje się "przy okazji" podczas przekazywania parametrów do funkcji, na przykład:

Funkcja(string("Łańcuch"), MojWektor[2])
Zapomniałem to jasno napisać - moja wina. Na szczęście domyśliliście się o co chodzi.

Dzięki za pomoc i cieszę się, że wam też się ten temat przydał!

Jako że żaden z was nie opisał jeszcze tutaj dokładnie co zrobić, a linki do notek na blogach to nie najczytelniejsza forma wiedzy, opiszę co zadziałało w moim przypadku (Visual Studio 2005 Professional, język C++):

- Zalogowany na koncie o prawach admina
- regedit.exe
- Klucz: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\NativeDE\StepOver
- Nowa wartość ciągu: nazwa dowolna, wartość:
std\:\:.*
To jest oczywiście wyrażenie regularne i można podać dowolne inne.

Wygląda na to, że w przeciwieństwie do tego co wg tamtych artykułów miało być w poprzednich wersjach Visuala, w 2005 nie ma kończenia wartości łańcuchem "=NoStepInto".

Trzeba będzie napisać programik do edycji tej listy... :)

Offline Xion

  • Redaktor
    • xion.log

# Maj 04, 2007, 13:05:22
mina87: Tak prawde powiedziawszy to chyba najlepszy byłby IMHO zwykły checkbox w postaci:

[X] Trace external files

czyli śledzenia kodu plików nienależących do projektu. Po prostu: chcesz debugować jakiś plik, to go włączasz do projektu; nie chcesz, no to zostawiasz w spokoju :) Rozwiązanie proste i chyba nawet niezbyt trudne do implementacji (w końcu nietrudno sprawdzić, czy plik do którego tracing ma wejść, jest jeszcze w projekcie, czy już nie). Opcja ta byłąby oczywiścię włączona w Debug i wyłączona w Release.
Ewentualnie, jeżeli zachodziłaby jednak potrzeba dołączenia do projektu zewnętrznych plików, których śledzić nie chcemy, przydałaby się jeszcze możliwośc zrobienia wyjątków per plik. Natomiast ustawianie tego dla każdej klasy czy metody to już chyba troszkę za dużo :)

A co do pokawałkowania... Ja bym użycie takiej dyrektywy widział mniej więcej tak:

#pragma trace(off)
#include /* wszystkie nagłówki std, boost, windows, DX i czego tam dusza pragnie */
#pragma trace(on)
#include /* nagłowki naszego projektu */

a więc podobnie do wspomnianego .nolist i .list. W sumie dałoby dwie dodatkowe linijki w kilku nagłówkach projektu - wygodne zwłaszcza przy korzystaniu z PCH.

Regedit: Wyrażenie regularne? Mnie to wygląda raczej na wildcardsy, albo raczej na miks regexp i wildcardsów. Tak czy siak, nietrudno zgadnąć, że:

std\:\:.*
boost\:\:.*

załatwi większość problemów :) A programik to już chyba nadużycie ;P

Offline Kot

  • Użytkownik

# Maj 04, 2007, 13:26:32
Super, dzięki :).
Dodam tylko, że dla Visual Studio C++ 2005 Express Edition jest to klucz:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VCExpress\8.0\NativeDE\StepOver
Wypadałoby teraz żeby ktoś to wrzucił do wiki.

Offline mINA87

  • Użytkownik

# Maj 04, 2007, 13:34:06
Xion: normalny regexp przecież :]
\: - zwykły : nie sterujący
.* - dowolny znak powtórzony pomiędzy 0 a nieskończenie wiele razy
Więc wszystko gra :) Jak sa wątpliwości to trzeba jeszcze obczytać Microsoftowskiego refa do regularnych.
To Trace external files też nie rozwiąże do końca sprawy - np. singletony czy bardzo często używane akcesory. O ile singleton pewnie będzie szablonem przez co będzie w całości w pliku nagłówkowym implementacja i będzie można wyrzucić .h z projektu (chociaż niezbyt to fajne imho - chce mieć w projekcie wszystko co do niego należy) o tyle już akcesor jakiś denerwujący nas może być w cpp i wtedy lipa. Chociaż w ogólnych sytuacjach takie coś mogłoby wystarczyć.
Z tą pragmą to tylko będzie brudzić sekcje include'ów.. Jakoś mi się to nie podoba - leniwy jestem, za dużo kopiuj-wklejaniny :P
Właśnie nie tyle programik co plugin świetnie rozwiązałby sprawę :] Mnie tylko zastanawia czy da się jakoś modyfikować tę listę w real-time'ie ]:->

Offline MoN

  • Użytkownik

# Maj 04, 2007, 14:04:37
A nie daloby sie tak lopatologicznie? Nie mam w sumie pojecia o tych pluginach, ale czy nie daloby sie zrobic czegos takiego ze jak debuger zatrzyma sie na pliku nienalezacym do projektu (wzglednie jakichstam innych co nam sie podobaja) to po prostu robi jeszcze raz step into itd. ??

Offline Xion

  • Redaktor
    • xion.log

# Maj 04, 2007, 15:38:12
mINA87: A fakt, normalne regexpy - po prostu źle interpretowałem tę kropkę ;)

Cytuj
O ile singleton pewnie będzie szablonem przez co będzie w całości w pliku nagłówkowym implementacja i będzie można wyrzucić .h z projektu (chociaż niezbyt to fajne imho - chce mieć w projekcie wszystko co do niego należy)
I tu by mogło zadziałać ustawienie wyjątku dla pliku (czyli zasadniczo śledzimy pliki projektu, ale akurat tego .h nie).

A do akcesorów z kolei znów lepszym rozwiązaniem wydaje się #pragma ;) Ostatecznie najlepiej więc byłoby tak, aby mechanizm ten był jak najbardziej elastyczny: od plików, przez klas, metody, może nawet do poszczególnych bloków kodu albo zwykłych zakresów wierszy. Taak, Microsoft miałby zajęcie ;)

MoN: Mniej więcej o tak działającym pluginie/rozszerzeniu przyszłej wersji IDE sobie niezobowiązująco teoretyzujemy :)