Göm menyn
Detta är en gammal version av kurshemsidan och kan innehålla inaktuell information. Klicka här för att komma till årets upplaga av kursen.

TDIU16 Process- och operativsystemprogrammering

Visualiseringsverktyg


Här finns ett visualiseringsverktyg för trådning och pekare/referenser i C (och till viss del även C++). Verktyget kan köra enkel C-kod och visa vad som händer. Verktyget har koll på vad som är giltigt och inte giltigt att göra i multitrådade program, och kan peka på vad som blir fel när det händer.

Verktyget kan användas på två sätt (båda är bra övningar inför den typen av uppgifter som kommer på tentan):

  1. Du kan ladda och visa kod som du har på din dator. På det sättet kan du undersöka vad som händer i din kod, och förhoppningsvis hitta och eliminera buggar.
  2. Det finns också ett online-läge där du kan lösa synkroniseringsproblem som andra har lagt upp.

Hämta verktyget

Ladda ner verktyget från en av länkarna nedan, packa upp filen någonstans och kör start.sh eller start.bat.

  • Verktyg för Linux (Bör fungera i Debian-baserade system, fungerar åtminstone i ThinLinc)

    På Linux öppnas troligtvis en grafisk arkivhanterare som standard. Markera i så fall alla filer (Ctrl+A), och välj Packa upp eller motsvarande, och välj sedan en tom mapp att lägga dem i. Alternativt, öppna en terminal i den mapp där du vill packa upp verktyget och skriv tar -xvf <sökväg till .tar-filen>. Kör sedan start.sh genom att antingen klicka på den i den grafiska miljön (du kan behöva välja Kör i terminal i meddelandet som visas), eller genom att skriva ./start.sh i terminalen.

  • Verktyg för Windows

    På Windows kommer du antagligen se meddelandet som visas i botten av sidan (Windows har skyddat datorn). Det är ett meddelande som visas för alla program som Windows inte känner igen sedan tidigare (dvs. program som inte många i världen laddar ner), och betyder inte nödvändigtvis att programmet är skadligt. Vill du köra programmet, klicka på Mer information och sedan Kör ändå (jag brukar ha för vana att skanna programmen med mitt virusprogram först). Du behöver bara godkänna detta första gången.

Undersök kod på din dator

När du har laddat ner och startat verktyget (se längre ner) kan du öppna egen kod med hjälp av File -> Open.... Verktyget kompilerar sedan koden och visar den. Du kan sedan stega i ditt program som du vill för att hitta synkroniseringsproblem. Verktyget förstår de synkroniseringsprimitiver som finns i Pintos (de vi tar upp i kursen), samt funktionen thread_new för att starta nya trådar.

Tyvärr klarar inte verktyget allt som går att göra i "vanlig" C. Detta för att verktyget behöver ha lite koll på vad koden försöker göra, vilket inte alltid går i vanlig C. Du märker när detta sker genom att verktyget ger ett kompileringsfel som inte en "vanlig" C-kompilator skulle ge. Det är också en bra idé att köra små exempel i visualiseringsverktyget för att det inte ska bli allt för svårt att se vad som händer.

Uppgifter/exempel

Här finns en uppsättning exempel som är anpassade för att köra i verktyget. Uppgifterna kan ibland även kompileras och köras utanför verktyget (dock endast på Linux i dagsläget). Om det finns en fil som heter Makefile kan du kompilera koden med kommandot make: skriv make x för att kompilera filen x.c. Detta går dock inte med alla exempel, eftersom vissa av dem är gjorda specifikt för visualiseringsverktyget.

Online-utmaningar

Verktyget har numera stöd för att dela problem och lösningar online. Idén är att det finns en samling program med synkroniseringsproblem i systemet (liknande de som kommer på tentan). Du kan sedan försöka dels hitta problemen, och dels föreslå lösningar på problemen. Jag (Filip) kommer att lägga upp diverse problem här under kursens gång.

För att börja behöver du logga in i systemet med ditt LiU-ID. Välj Online -> Connect. Första gången du gör detta får du ett meddelande om att du behöver logga in. Klicka på OK så öppnas din webbläsare. Välj där Use LiU-ID, och följ sedan instruktionerna. Notera att du kommer att få välja ett namn som visas till andra användare, du behöver inte använda ditt riktiga namn eller LiU-ID (du kan till och med ändra det senare). När du är klar kommer webbsidan att be dig att klicka på Online -> Connect igen. Denna gång får du inte ett meddelande, men resten av alternativen i Online-menyn blir tillgängliga.

För att börja lösa problem kan du sedan välja Online -> Problems... för att se de problem som finns i systemet. Här finns fyra flikar med problem (ett problem är en bit kod som kanske innehåller ett synkroniseringsproblem):

  • New problems nya problem som någon användare har lagt upp i systemet.
  • Improved någon har modifierat något av problemen i New problems och har föreslagit en lösning (som kanske eller kanske inte är korrekt).
  • Solved här finns alla problem som du har löst. När du har löst ett problem kan du även se andra lösningar till samma problem.
  • My problems här finns de problem som du har laddat upp, så att du enkelt kan se om andra har hittat fel i den, eller om de tror att den är korrekt.

Klicka sedan på ett problem som du vill försöka lösa (börja lämpligtvis med något under New problems). Klicka sedan på den gröna knappen Solve. Verktyget kommer då att öppna problemet, och du kan inspektera det för att försöka hitta ett fel. För att se hela koden enklare kan du välja File -> Open in editor. Din uppgift är nu att hitta ett sätt att få programmet att göra fel. Du kan leta efter:

  • Data races när flera trådar läser eller skriver till samma variabler på ett osäkert sätt.
  • Kraschar när programmet kraschar på något sätt, exempelvis genom att läsa utanför ett array eller dereferera en pekare som inte längre är giltig.
  • Assert när programmet gör fel enligt vad programmeraren ville så att ett villkor inuti en assert inte uppfylls

Du kan också starta flera trådar som kör main (med Run -> New thread) om du tror att det hjälper dig att hitta ett fel. Tror du att programmet inte innehåller något fel kan du klicka på knappen i den gröna rutan i toppen av verktyget. Du kan också klicka på Run -> Restart för att börja om från början. Du kan göra det hur många gånger du vill.

När du har fått programmet att göra fel på något sätt, eller om du tycker att programmet ser ut att vara korrekt kommer verktyget att meddela dig det, och fråga om du vill publicera din lösning. Klickar du på Yes kommer systemet spara det, och du får poäng för din lösning. Har du hittat ett problem kommer andra kunna se hur du hittade problemet.

Hittade du ett problem så kommer du också få möjligheten att försöka lösa problemet (du behöver inte göra det om du inte vill). Välj då Open in editor för att redigera källkoden som du vill, klicka sedan på Reload för att ladda in de nya ändringarna i verktyget och testa dem. När du känner dig klar kan du välja Submit this version! i den gröna listen. Gör du det så kommer problemet att publiceras så att andra kan se det under sin Improved-flik, och försöka hitta fel i din förbättrade kod. Du får poäng för varje person som försöker lösa ditt problem.

Du kan också ladda upp nya problem med Online -> Submit problem.... Då betraktas det som ett nytt problem och hamnar under New problems för alla andra.

Poäng

Du får poäng för problem som du har löst, och om andra försöker sig på dina problem. Du kan se hur många poäng du har under Online -> Status... samt en topplista över de 10 personerna med högst poäng.

Du får poäng enligt följande:

Du har hittat något fel i ett problem   5 p
Du kom fram till att ett problem inte innehåller ett fel   1 p
Du har försökt förbättra ett problem efter att ha hittat ett fel   2 p
Någon annan har hittat ett fel i ett av dina problem   1 p
Någon annan tycker att ett av dina problem ser korrekt ut   2 p

Sidansvarig: Filip Strömbäck, Klas Arvidsson
Senast uppdaterad: 2021-04-11