LU-LSP-b11:MD4

From DiLab
Jump to: navigation, search

MD4

Procedūru izsaukumu steka izdruka.

Mērķi

  • Apgūt steka struktūru un komunikācijas mehānismu starp procedūrām.
  • Praktizēt atkļūdošanas metodes kas saistītas ar steka analīzi un procedūru izsaukumu steku.

Uzdevums

Izveidot programmatūras palīg-rīkus, kas nodrošina procedūru izsaukumu steka izdruku. Definēt tos failos md4.c un md4.h. Izveidot testa failu test.c, kas demonstrē izstrādāta palīg-rīka lietojumu ar piemēru, kur izdrukāts izsaukumu steks vismaz 3 izsaukumu dziļumā.

Failā md4.h definēti makro PCS_TAG() un PCS_PRINT(depth), kā arī deklarēta funkcija void pcsPrint(unsigned depth), kas izmantojamas analizējamajā failā:

  • PCS_TAG() - birkas makro, ko ievieto kā pirmo izsaukumu katras procedūras sākumā.
  • PCS_PRINT(depth) - makro, kas izsauc steka printēšanas funkciju
  • void pcsPrint(unsigned depth) - funkcija, kas (uz stdout) drukā procedūru izsaukumu steku. Parametrs 'depth' norāda izsaukumu steka dziļumu (funkciju izsaukumu skaitu), kas jādrukā.
  • Minētā funkcija realizēta failā md4.c

Izdrukas formāts ir sekojošs:

CallStack at Failavārds:rindasNr
fails, rindasNr., funkcijasVards, funkcijasAdrese, izsaucējaAtgriešanāsAdrese [,parametru vērtības bonusa gadījumā]
fails, rindasNr., funkcijasVards, funkcijasAdrese, izsaucējaAtgriešanāsAdrese [,parametru vērtības bonusa gadījumā]
fails, rindasNr., funkcijasVards, funkcijasAdrese, izsaucējaAtgriešanāsAdrese [,parametru vērtības bonusa gadījumā]

PCS_PRINT() makro var tik realizēts šādi:

#define PCS_PRINT(depth) do {\
    fprintf(stdout, "CallStack at %s:%d", __FILE__, __LINE__); \
    pcsPrint(depth); \
  } while (0)


Kodā aizliegts izmantot GCC iebūvēto funkciju __builtin_return_address() un tamlīdzīgas!

Drīkst pieņemt, ka kods tiks kompilēts bez ieslēgtām optimizācijām.

Jāiesniedz

  • Jāiesniedz C programmas pirmkods md4.c, md4.h, test.c un Makefile.
  • Visi iesniedzamie faili jāsapako arhīvā LSP_MD4_vards_uzvards.tgz
  • Arhīva fails sūtāms pa epastu piekabē, ar sekojošu "Subject:" LSP MD4 vards uzvards

Vērtējums

Mājasdarbs tiks vērtēts sekojoši:

  1. 50% - Korekta steka izdruka uz pievienota piemēra,
  2. 50% - Korekta steka izdruka uz jebkura (pasniedzēja) piemēra,

Par šo mājasdarbu var saņemt arī papildus vērtējumu, ja izpilda arī vienu no šiem uzdevumiem:

  • realizē arī funkciju/makro PCS_PRINT_HEX(), kura drukā tikai funkciju adreses. Šim makro parametrs depth netiek padots; to izsaucot jādrukā visa funkciju ķēdīte līdz steka "beigām". Šim makro jāspēj strādāt arī tad, ja kodā netiek lietots makro PCS_TAG()!
  • drukā arī funkciju parametru vērtības. Šim nolūkam drīkst papildināt makro PCS_TAG(), piemēram, ļaujot norādīt tam parametrus.

Piemēri

Piemērs test.c failam

#include <stdio.h>
#include "md4.h"

int c(){
  PCS_TAG();
  int z=44;
  PCS_PRINT(4);
  return z-3;
}
  
int b(int i){
  PCS_TAG();
  int x;
  x=x*c();
  return x;
}

int a(int i){
  PCS_TAG();
  return b(i+4);
}

int main(){
  PCS_TAG();
  int i=0;
  return a(i);
}


Derīga informācija

  • Ieteikums: izstrādājiet programmatūru pakāpeniski. Piemēram, vispirms ielasiet un izdrukājiet datus. Tad pievienojiet datu analīzi un reģistrēšanu savās datu struktūrās. Tad pievienojiet datu analīzi lai tos sakārtotu izdrukai. Testējiet vispirms uz pareiziem datiem. tad uz kļūdainiem datiem.


J&A (jautājumi un atbildes)

J: Uzdevums pārāk grūts, vai var pagarināt termiņu?

A: Noteiktais termiņš paliek spēkā. Iesaku risināt savlaicīgi, lai pietiek laika neparedzētu problēmu risināšanai.


Uz LSP kursa sākuma lapu.