Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Visual Studio poskytuje několik nástrojů a prvků uživatelského rozhraní, které vám pomůžou ladit vícevláknové aplikace. V tomto kurzu se dozvíte, jak používat značky vláken, okno Paralelní zásobníky , okno Paralelní sledování , podmíněné zarážky a zarážky filtru. Dokončení tohoto kurzu vás seznámí s funkcemi sady Visual Studio pro ladění vícevláknových aplikací.
Kurzy, které jsou zaměřené na scénáře, najdete v následujících článcích.
Prvním krokem je vytvoření projektu vícevláknové aplikace.
Vytvořte projekt vícevláknové aplikace
Otevřete Visual Studio a vytvořte nový projekt.
Pokud úvodní okno není otevřené, zvolte Soubor>Okno Start.
V úvodním okně zvolte Vytvořit nový projekt.
V okně Vytvořit nový projekt zadejte konzolu do vyhledávacího pole. Dále v seznamu jazyků zvolte C#, C++ nebo Visual Basic a pak v seznamu Platformy zvolte Windows .
Po použití filtrů jazyka a platformy zvolte šablonu konzolové aplikace pro .NET nebo C++ a pak zvolte Další.
Poznámka:
Pokud nevidíte správnou šablonu, přejděte na NástrojeZískat nástroje >a funkce..., čímž se otevře instalační program sady Visual Studio. Zvolte vývoj desktopových aplikací .NET nebo vývoj desktopových aplikací pomocí úlohy C++ a pak zvolte Upravit.
V okně Konfigurovat nový projekt zadejte MyThreadWalkthroughApp do pole Název projektu. Pak zvolte Možnost Další nebo Vytvořit podle toho, která možnost je k dispozici.
Pro projekt .NET Core nebo .NET 5+ zvolte buď doporučenou cílovou architekturu, nebo .NET 8, a pak zvolte Vytvořit.
Zobrazí se nový konzolový projekt. Po vytvoření projektu se zobrazí zdrojový soubor. V závislosti na zvoleném jazyce se zdrojový soubor může volat Program.cs, MyThreadWalkthroughApp.cpp nebo Module1.vb.
Odstraňte kód, který se zobrazí ve zdrojovém souboru, a nahraďte ho následujícím aktualizovaným kódem. Zvolte odpovídající úryvek pro konfiguraci vašeho kódu.
using System; using System.Threading; public class ServerClass { static int count = 0; // The method that will be called when the thread is started. public void InstanceMethod() { Console.WriteLine( "ServerClass.InstanceMethod is running on another thread."); int data = count++; // Pause for a moment to provide a delay to make // threads more apparent. Thread.Sleep(3000); Console.WriteLine( "The instance method called by the worker thread has ended. " + data); } } public class Simple { public static void Main() { for (int i = 0; i < 10; i++) { CreateThreads(); } } public static void CreateThreads() { ServerClass serverObject = new ServerClass(); Thread InstanceCaller = new Thread(new ThreadStart(serverObject.InstanceMethod)); // Start the thread. InstanceCaller.Start(); Console.WriteLine("The Main() thread calls this after " + "starting the new InstanceCaller thread."); } }V nabídce Soubor vyberte Uložit vše.
(Jenom Visual Basic) V Průzkumníku řešení (pravé podokno) klikněte pravým tlačítkem myši na uzel projektu a zvolte Vlastnosti. Na kartě Aplikace změňte objekt Po spuštění na Jednoduchý.
Ladění vícevláknové aplikace
V editoru zdrojového kódu vyhledejte následující fragment kódu:
Kliknutím levým tlačítkem myši na levý okraj
Thread.Sleepnebo, u C++,std::this_thread::sleep_forvložte novou zarážku.V okapu červený kruh označuje, že byl zarážkový bod nastaven na tomto místě.
V nabídce Ladění vyberte Spustit ladění (F5).
Visual Studio sestaví řešení, aplikace se spustí s připojeným ladicím programem, a poté se zastaví na bodu přerušení.
V editoru zdrojového kódu vyhledejte řádek obsahující zarážku.
Objevte značku vlákna
Na panelu nástrojů Ladění vyberte tlačítko Zobrazit vlákna ve zdroji
.Stiskněte dvakrát klávesu F11 pro přechod ladicího nástroje.
Podívejte se na žlab na levé straně okna. Na tomto řádku si všimněte ikony značky vlákna
, která se podobá dvěma propleteným vláknům. Značka vlákna označuje, že vlákno je v tomto umístění zastaveno.Značka vlákna může být částečně skryta bodem přerušení.
Najeďte myší na značku vlákna. Objeví se popis s informacemi o názvu a ID čísle každého zastaveného vlákna. V tomto případě je název pravděpodobně
<noname>.
Výběrem značky vlákna zobrazíte dostupné možnosti v místní nabídce.
Zobrazení umístění vláken
V okně Paralelní zásobníky můžete přepínat mezi zobrazením vláken a zobrazením úloh (pokud jde o programování založené na úlohách) a zobrazit informace o zásobníku volání pro každé vlákno. V této aplikaci můžeme použít zobrazení vláken.
Otevřete okno Paralelní zásobníky výběrem možnosti Ladění>Windows>Paralelní zásobníky. Mělo by se zobrazit něco podobného jako v následujícím příkladu. Přesné informace se můžou lišit v závislosti na aktuálním umístění jednotlivých vláken, hardwaru a programovacího jazyka.
V tomto příkladu zleva doprava vidíme tyto informace pro spravovaný kód:
- Aktuální vlákno (žlutá šipka) vstoupilo do
ServerClass.InstanceMethod. ID vlákna a rámec zásobníku vlákna můžete zobrazit tak, že na něj najedete myšíServerClass.InstanceMethod. - Vlákno 31724 čeká na zámek vlastněný vláknem 20272.
- Hlavní vlákno (vlevo) se zastavilo na [Externí kód], které můžete zobrazit podrobně, pokud zvolíte Zobrazit externí kód.
V tomto příkladu zleva doprava vidíme tyto informace pro spravovaný kód:
- Hlavní vlákno (na levé straně) se zastavilo na
Thread.Start, kde je bod zastavení identifikován ikonou značky vlákna
. - Dvě vlákna vstoupila do
ServerClass.InstanceMethod, z nichž jedno je aktuální vlákno (žlutá šipka), zatímco druhé vlákno se zastavilo vThread.Sleep. - Začíná se také nové vlákno (vpravo), ale je zastaveno
ThreadHelper.ThreadStart.
Poznámka:
Další informace o použití zobrazení Vlákna naleznete v tématu Ladění zablokování pomocí zobrazení Vlákna.
- Aktuální vlákno (žlutá šipka) vstoupilo do
Chcete-li zobrazit vlákna v zobrazení seznamu, vyberte Ladit>Windows>vlákna.
V tomto zobrazení můžete snadno vidět, že vlákno 20272 je hlavní vlákno a aktuálně se nachází v externím kódu, konkrétně System.Console.dll.
Po kliknutí pravým tlačítkem myši v okně Paralelní zásobníky nebo vlákna zobrazíte dostupné možnosti v místní nabídce.
Z těchto nabídek po kliknutí pravým tlačítkem myši můžete provádět různé akce. V tomto kurzu prozkoumáte další podrobnosti v okně paralelního sledování (další části).
Nastavit sledování na proměnnou
Otevřete okno Paralelní sledování výběrem možnosti Ladit>Windows>Paralelní sledování>Paralelní sledování 1.
Vyberte buňku
<Add Watch>, ve které vidíte text (nebo prázdnou buňku záhlaví ve čtvrtém sloupci) a zadejtedata.Hodnoty datové proměnné pro každé vlákno se zobrazí v okně.
Vyberte buňku
<Add Watch>, ve které vidíte text (nebo prázdnou buňku záhlaví v pátém sloupci) a zadejtecount.Hodnoty proměnné
countpro každé vlákno se zobrazí v okně. Pokud ještě tyto informace nevidíte, zkuste několikrát stisknout klávesu F11 , abyste mohli přejít na provádění vláken v ladicím programu.
Kliknutím pravým tlačítkem myši na jeden z řádků v okně zobrazíte dostupné možnosti.
Označit a odznačit vlákna
Vlákna můžete označit příznakem, abyste mohli sledovat důležitá vlákna a ignorovat ostatní vlákna.
V okně Paralelní kukátko podržte klávesu Shift a vyberte více řádků.
Klikněte pravým tlačítkem myši a vyberte Příznak.
Všechna vybraná vlákna jsou označena. Teď můžete filtrovat tak, aby zobrazovala pouze vlákna označená příznakem.
V okně Sledování paralel vyberte tlačítko Zobrazit pouze označená vlákna
.V seznamu se zobrazí pouze označená vlákna.
Návod
Po označení některých vláken můžete kliknout pravým tlačítkem myši na řádek kódu v editoru kódu a zvolit Spustit vlákna s příznakem kurzoru. Nezapomeňte zvolit kód, kterého dosáhnou všechna označená vlákna. Visual Studio pozastaví vlákna na vybraném řádku kódu, což usnadňuje řízení pořadí provádění ukotvením a rozmrznutím vláken.
Znovu vyberte tlačítko Zobrazit pouze vlákna s příznakem a přepněte zpět do režimu Zobrazit všechna vlákna .
Pokud chcete zrušit označení vláken, klikněte pravým tlačítkem myši na jedno nebo více vláken s příznakem v okně Paralelní kukátko a vyberte Zrušit označení.
Ukotvení a rozmrznutí provádění vlákna
Návod
Můžete ukotvit a rozmrazit vlákna (pozastavit a obnovit) a řídit pořadí, ve kterém vlákna provádějí práci. To vám může pomoct při řešení problémů se souběžností, jako jsou zablokování a podmínky časování.
V okně Paralelní sledování se všemi vybranými řádky klikněte pravým tlačítkem myši a vyberte Ukotvit.
Ve druhém sloupci se pro každý řádek zobrazí ikona pozastavení. Ikona pozastavení označuje, že vlákno je zastavené.
Zrušte výběr všech ostatních řádků tak, že vyberete jenom jeden řádek.
Klikněte pravým tlačítkem myši na řádek a vyberte Thaw.
Ikona pozastavení zmizí v tomto řádku, což znamená, že vlákno už není zmražené.
Přepněte do editoru kódu a stiskněte klávesu F11. Pouze rozmrazené vlákno se spustí.
Aplikace může také spustit nová vlákna. Všechna nová vlákna nejsou zmrzlá a nezablokují se.
Sledování jednoho vlákna s podmíněnými zarážky
Může být užitečné sledovat průběh provádění jednotlivého vlákna v ladicím programu. Jedním ze způsobů, jak to udělat, je zmrazení vláken, které vás nezajímají. V některých scénářích možná budete muset postupovat podle jednoho vlákna, aniž byste zamrzli jiná vlákna, například k reprodukci konkrétní chyby. Pokud chcete sledovat vlákno, aniž byste zastavili ostatní vlákna, musíte se vyhnout zasahování do kódu s výjimkou vlákna, které vás zajímá. Tuto úlohu můžete provést nastavením podmíněné zarážky.
Zarážky můžete nastavit pro různé podmínky, například název vlákna nebo ID vlákna. Může být užitečné nastavit podmínku na data, která víte, že jsou jedinečná pro každé vlákno. Tento přístup je při ladění běžný, pokud vás více zajímá konkrétní hodnota dat než konkrétní vlákno.
Klikněte pravým tlačítkem myši na zarážku, kterou jste vytvořili dříve, a vyberte Podmínky.
V okně Nastavení zarážky zadejte
data == 5pro podmíněný výraz.
Návod
Pokud vás více zajímá konkrétní vlákno, použijte pro podmínku název vlákna nebo ID vlákna. Pokud to chcete udělat v okně Nastavení zarážky , vyberte filtr místo podmíněného výrazu a postupujte podle tipů pro filtrování. Možná budete chtít pojmenovat vlákna ve svém aplikačním kódu, protože ID vláken se změní při každém restartování ladicího programu.
Zavřete okno Nastavení přerušovacího bodu.
Vyberte tlačítko
pro restartování ladicí relace.Na vlákně, kde je hodnota datové proměnné 5, rozdělíte kód. V okně Paralelní sledování vyhledejte žlutou šipku, která označuje aktuální kontext ladicího programu.
Teď můžete přejít přes kód (F10) a přejít do kódu (F11) a postupovat podle provádění jednoho vlákna.
Pokud je podmínka zarážky jedinečná pro vlákno a ladicí program nenarazí na žádné další zarážky v jiných vláknech (možná je budete muset zakázat), můžete přejít přes kód a krokovat do kódu, aniž byste přešli na jiná vlákna.
Poznámka:
Když posunete ladicí program vpřed, spustí se všechna vlákna. Ladicí program však nepřeruší provádění kódu v jiných vláknech, pokud některé z dalších vláken nenarazí na bod přerušení.
Související obsah
- Ladění vícevláknových aplikací
- Jak na to: Přepnutí na jiné vlákno při ladění
- Postupy: Použití okna Paralelní zásobník
- Postupy: Použití okna Paralelní sledování