VC2012: Debuggen von Multithreaded Programmen



  • Hallo,
    ich habe eine Frage zum Debuggen eines Programm (C++) mit mehreren Threads: wenn ich einen Breakpoint setze, möchte ich (meist) nur in dieser Thread debuggen, also Einzelschritt oder Prozedurschritt. Manchmal passiert es aber, dass (falls eine andere Thread gerade laufwillig ist) Einzel- bzw. Prozedurschritt in dieser anderen Thread landen.

    Frage: kann man dieses Verhalten generell abschalten, also, dass die laufwillige Thread zwar ausgeführt wird, beim Debuggen aber nicht gewechselt wird?

    Vielen Dank für Tipps!


  • Mod

    Wenn die Threads laufen kannst Du das nicht verhindern.

    Aber Du kannst einfach alle anderen Threads "Freezen" im Thread-Fenster.

    Grundsätzlich ein Breakpoint ist ein Breakpoint und gilt eben für alle Threads.
    Hilfe kann hier ein Breakpoint Filter auf den speziellen Breakpoints sein.
    Das Vorgehen ist hier beschrieben:
    http://stackoverflow.com/questions/3048064/can-i-set-a-breakpoint-in-visual-studio-c-to-break-on-a-thread-context-switc
    und hier
    http://stackoverflow.com/questions/336628/step-over-when-debugging-multithreaded-programs-in-visual-studio/378584#378584

    Grundsätzlich gibt es das für ein Step-Over nicht.



  • Grundsätzlich ein Breakpoint ist ein Breakpoint und gilt eben für alle Threads.

    Es geht ihm doch nicht um den Breakpoint.
    Es geht ihm darum, dass, nachdem der Breakpoint bereits getroffen wurde, wenn er dann (ganz normal, ohne dass noch weiter Breakpoints im Spiel wären) auf "Step" drückt, er auf einmal *schwupps* in einem anderen Thread landet.
    Was mich ehrlich gesagt auch oft nervt.



  • Ja, hustbaer, genau das hab ich gemeint.

    Danke auch @Martin, den Fall, dass verschiedene Threads dieselbe Methode/funktion aufrufen hatte ich auch schon (ds mit dem Filter hilft hier auch!).



  • Ich hab' jetzt glaub' ich auch verstanden was Martin gemeint hat - vermutlich 🙂
    Weil im Hintergrund ist ein "step" natürlich auch ein Breakpoint. Wobei mich als User das natürlich weniger interessiert.

    Es scheint aber so zu sein dass VS beim Steppen nicht grundsätzlich in andere Threads breakt -- nur in Threads "in denen man schonmal war". Also welche wo man schonmal auf nen Breakpoint aufgelaufen ist. (Ob der Thread den man mehr ober weniger zufällig bekommt wenn man "Pause" macht zählt weiss ich nicht.)
    So zumindest die Behauptung eines Users im 2. von Martin verlinkten SO Beitrag.

    Und irgendwie ist VS da auf jeden Fall ein Bisschen schlau, denn in Threads diverser Win32 Subsysteme/Komponenten (COM/RPC, DirectShow, ...) hat mich VS noch nie "einfach so" reingebreakt (ausser natürlich beim "Pause" drücken).

    EDIT: Wort vergessen.



  • @hustbaer

    Ich hab auf deinen Hinweis
    "Es scheint aber so zu sein dass VS beim Steppen nicht grundsätzlich ...."
    mal getestet, ob das so ist, Und ich muss sagen: es scheint wirklich so zu sein: wenn man in in Thread B einmal auf einen BP gelaufen ist, kommt man beim Steppen in Thread A tatsächlich in Thread B. Ansonsten steppt er nur in Thread A. Das passt wohl so.

    Danke an Euch beide!


Log in to reply