Трассировка и защита памяти

Strace

https://strace.io

ИРЛ:

Другие похожие инструменты

Файл с примером:

   1 #include <stdio.h>
   2 #include <string.h>
   3 #include <stdlib.h>
   4 
   5 int main(int argc, char *argv[]) {
   6         int i;
   7         char *s;
   8 
   9         s = strdup(argv[argc-1]);
  10         for(i=0; i<4; i++)
  11                 printf("%s: %d, %d\n", s, rand(), i*2+1);
  12 
  13         return 0;
  14 }

   1 #include<stdio.h>
   2 #define TELEPORT 12
   3 
   4 void f()
   5 {
   6     int j=20;
   7     int* a = &j;
   8     *(a+TELEPORT)+=7;
   9 }
  10 
  11 int main()
  12 {
  13     int i;
  14     i=20;
  15     printf("\n i = %d \n", i);
  16     f();
  17     printf("\n i = %d \n", i);
  18     return 0;
  19 }

Огороды памяти

Valgrind

https://valgrind.org

Утечка памяти не обязательно приводит к ошибке. Порча памяти, к сожалению, тоже.

Д/З

  1. Прочитать про
  2. Создать в репозитории каталог 07_DebuggingTracing и положить туда решение следующей задачи:

    • Выяснить, какой функцией пользуется команда rm при удалении обычного файла

    • Написать LD_PRELOAD-враппер вокруг этой функции, который при попытке удалить файл с именем, содержащим подстроку FIX, возвращал бы ошибку EPERM

    • Написать как минимум Makefile (или любой другой сценарий) для
      • сборки библиотеки-враппера
      • тестирования библиотеки-враппера (без враппера два файла удаляются, с враппером удаляется только один, плюс можно ещё exit status проверить, если не лень)
      • удаления генератов
    • <!> (необязательно) оформить это в виде autotools/CMake/… проекта

      • если делать всё по инструкции (читать так: 5.4.1, затем 5.3, затем 3.2, в котором написано, что библиотека откладывается в каталог .libs) вам понадобится установить libtool

      • У меня вышло как-то так:

        o2.gif

LecturesCMC/LinuxApplicationDevelopment2020/07_DebuggingTracing (последним исправлял пользователь FrBrGeorge 2020-10-31 21:15:43)