[bootlin/training-materials updates] master: debugging: labs: rename png to png_convert and add commands to compile (a78f19d6)
Clément Léger
clement.leger at bootlin.com
Thu Nov 17 14:40:53 CET 2022
Repository : https://github.com/bootlin/training-materials
On branch : master
Link : https://github.com/bootlin/training-materials/commit/a78f19d6fb1c3fbd6a176a15920afde335b9c2ec
>---------------------------------------------------------------
commit a78f19d6fb1c3fbd6a176a15920afde335b9c2ec
Author: Clément Léger <clement.leger at bootlin.com>
Date: Thu Nov 17 14:40:53 2022 +0100
debugging: labs: rename png to png_convert and add commands to compile
Signed-off-by: Clément Léger <clement.leger at bootlin.com>
>---------------------------------------------------------------
a78f19d6fb1c3fbd6a176a15920afde335b9c2ec
.../debugging/nfsroot/root/app_profile/Makefile | 4 -
lab-data/debugging/nfsroot/root/app_profile/png.c | 179 ---------------------
.../debugging/nfsroot/root/app_profile/tux.png | Bin 477436 -> 0 bytes
.../debugging/nfsroot/root/app_profiling/Makefile | 4 +
.../nfsroot/root/app_profiling/png_convert.c | 179 +++++++++++++++++++++
.../debugging/nfsroot/root/app_profiling/tux.png | Bin 0 -> 477436 bytes
.../debugging-application-profiling.tex | 10 +-
7 files changed, 191 insertions(+), 185 deletions(-)
diff --git a/lab-data/debugging/nfsroot/root/app_profile/Makefile b/lab-data/debugging/nfsroot/root/app_profile/Makefile
deleted file mode 100644
index 1da2470e..00000000
--- a/lab-data/debugging/nfsroot/root/app_profile/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-CC=${CROSS_COMPILE}gcc
-
-png: png.c
- ${CC} $< -g3 -lpng -o $@
diff --git a/lab-data/debugging/nfsroot/root/app_profile/png.c b/lab-data/debugging/nfsroot/root/app_profile/png.c
deleted file mode 100644
index 68a6b35f..00000000
--- a/lab-data/debugging/nfsroot/root/app_profile/png.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright 2002-2010 Guillaume Cottenceau.
- *
- * This software may be freely redistributed under the terms
- * of the X11 license.
- *
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-
-#define PNG_DEBUG 3
-#include <png.h>
-
-void abort_(const char *s, ...)
-{
- va_list args;
- va_start(args, s);
- vfprintf(stderr, s, args);
- fprintf(stderr, "\n");
- va_end(args);
- abort();
-}
-
-int x, y;
-
-int width, height;
-png_byte color_type;
-png_byte bit_depth;
-
-png_structp png_ptr;
-png_infop info_ptr;
-int number_of_passes;
-png_bytep *row_pointers;
-
-void read_png_file(char *file_name)
-{
- char header[8]; // 8 is the maximum size that can be checked
-
- /* open file and test for it being a png */
- FILE *fp = fopen(file_name, "rb");
- if (!fp)
- abort_("[read_png_file] File %s could not be opened for reading", file_name);
- fread(header, 1, 8, fp);
- if (png_sig_cmp(header, 0, 8))
- abort_("[read_png_file] File %s is not recognized as a PNG file", file_name);
-
- /* initialize stuff */
- png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-
- if (!png_ptr)
- abort_("[read_png_file] png_create_read_struct failed");
-
- info_ptr = png_create_info_struct(png_ptr);
- if (!info_ptr)
- abort_("[read_png_file] png_create_info_struct failed");
-
- if (setjmp(png_jmpbuf(png_ptr)))
- abort_("[read_png_file] Error during init_io");
-
- png_init_io(png_ptr, fp);
- png_set_sig_bytes(png_ptr, 8);
-
- png_read_info(png_ptr, info_ptr);
-
- width = png_get_image_width(png_ptr, info_ptr);
- height = png_get_image_height(png_ptr, info_ptr);
- color_type = png_get_color_type(png_ptr, info_ptr);
- bit_depth = png_get_bit_depth(png_ptr, info_ptr);
-
- number_of_passes = png_set_interlace_handling(png_ptr);
- png_read_update_info(png_ptr, info_ptr);
-
- /* read file */
- if (setjmp(png_jmpbuf(png_ptr)))
- abort_("[read_png_file] Error during read_image");
-
- row_pointers = (png_bytep *)malloc(sizeof(png_bytep) * height);
- for (y = 0; y < height; y++)
- row_pointers[y] = (png_byte *)malloc(png_get_rowbytes(png_ptr, info_ptr));
-
- png_read_image(png_ptr, row_pointers);
-
- fclose(fp);
-}
-
-void write_png_file(char *file_name)
-{
- /* create file */
- FILE *fp = fopen(file_name, "wb");
- if (!fp)
- abort_("[write_png_file] File %s could not be opened for writing", file_name);
-
- /* initialize stuff */
- png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-
- if (!png_ptr)
- abort_("[write_png_file] png_create_write_struct failed");
-
- info_ptr = png_create_info_struct(png_ptr);
- if (!info_ptr)
- abort_("[write_png_file] png_create_info_struct failed");
-
- if (setjmp(png_jmpbuf(png_ptr)))
- abort_("[write_png_file] Error during init_io");
-
- png_init_io(png_ptr, fp);
-
- /* write header */
- if (setjmp(png_jmpbuf(png_ptr)))
- abort_("[write_png_file] Error during writing header");
-
- png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE,
- PNG_FILTER_TYPE_BASE);
-
- png_write_info(png_ptr, info_ptr);
-
- /* write bytes */
- if (setjmp(png_jmpbuf(png_ptr)))
- abort_("[write_png_file] Error during writing bytes");
-
- png_write_image(png_ptr, row_pointers);
-
- /* end write */
- if (setjmp(png_jmpbuf(png_ptr)))
- abort_("[write_png_file] Error during end of write");
-
- png_write_end(png_ptr, NULL);
-
- /* cleanup heap allocation */
- for (y = 0; y < height; y++)
- free(row_pointers[y]);
- free(row_pointers);
-
- fclose(fp);
-}
-
-static void swap_colors(void)
-{
- for (x = 0; x < width; x++) {
- for (y = 0; y < height; y++) {
- png_byte *row = row_pointers[y];
- png_byte *ptr = &(row[x * 4]);
-
- /* set red value to 0 and green value to the blue one */
- ptr[0] = 0;
- ptr[1] = ptr[2];
- }
- }
-}
-
-
-static void process_file(void)
-{
- if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB)
- abort_("[process_file] input file is PNG_COLOR_TYPE_RGB but must be PNG_COLOR_TYPE_RGBA "
- "(lacks the alpha channel)");
-
- if (png_get_color_type(png_ptr, info_ptr) != PNG_COLOR_TYPE_RGBA)
- abort_("[process_file] color_type of input file must be PNG_COLOR_TYPE_RGBA (%d) (is %d)", PNG_COLOR_TYPE_RGBA,
- png_get_color_type(png_ptr, info_ptr));
-
- swap_colors();
-}
-
-int main(int argc, char **argv)
-{
- if (argc != 3)
- abort_("Usage: program_name <file_in> <file_out>");
-
- read_png_file(argv[1]);
- process_file();
- write_png_file(argv[2]);
-
- return 0;
-}
diff --git a/lab-data/debugging/nfsroot/root/app_profile/tux.png b/lab-data/debugging/nfsroot/root/app_profile/tux.png
deleted file mode 100644
index d609663f..00000000
Binary files a/lab-data/debugging/nfsroot/root/app_profile/tux.png and /dev/null differ
diff --git a/lab-data/debugging/nfsroot/root/app_profiling/Makefile b/lab-data/debugging/nfsroot/root/app_profiling/Makefile
new file mode 100644
index 00000000..91e8bfcc
--- /dev/null
+++ b/lab-data/debugging/nfsroot/root/app_profiling/Makefile
@@ -0,0 +1,4 @@
+CC=${CROSS_COMPILE}gcc
+
+png_convert: png_convert.c
+ ${CC} $< -g3 -lpng -o $@
diff --git a/lab-data/debugging/nfsroot/root/app_profiling/png_convert.c b/lab-data/debugging/nfsroot/root/app_profiling/png_convert.c
new file mode 100644
index 00000000..68a6b35f
--- /dev/null
+++ b/lab-data/debugging/nfsroot/root/app_profiling/png_convert.c
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2002-2010 Guillaume Cottenceau.
+ *
+ * This software may be freely redistributed under the terms
+ * of the X11 license.
+ *
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#define PNG_DEBUG 3
+#include <png.h>
+
+void abort_(const char *s, ...)
+{
+ va_list args;
+ va_start(args, s);
+ vfprintf(stderr, s, args);
+ fprintf(stderr, "\n");
+ va_end(args);
+ abort();
+}
+
+int x, y;
+
+int width, height;
+png_byte color_type;
+png_byte bit_depth;
+
+png_structp png_ptr;
+png_infop info_ptr;
+int number_of_passes;
+png_bytep *row_pointers;
+
+void read_png_file(char *file_name)
+{
+ char header[8]; // 8 is the maximum size that can be checked
+
+ /* open file and test for it being a png */
+ FILE *fp = fopen(file_name, "rb");
+ if (!fp)
+ abort_("[read_png_file] File %s could not be opened for reading", file_name);
+ fread(header, 1, 8, fp);
+ if (png_sig_cmp(header, 0, 8))
+ abort_("[read_png_file] File %s is not recognized as a PNG file", file_name);
+
+ /* initialize stuff */
+ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+
+ if (!png_ptr)
+ abort_("[read_png_file] png_create_read_struct failed");
+
+ info_ptr = png_create_info_struct(png_ptr);
+ if (!info_ptr)
+ abort_("[read_png_file] png_create_info_struct failed");
+
+ if (setjmp(png_jmpbuf(png_ptr)))
+ abort_("[read_png_file] Error during init_io");
+
+ png_init_io(png_ptr, fp);
+ png_set_sig_bytes(png_ptr, 8);
+
+ png_read_info(png_ptr, info_ptr);
+
+ width = png_get_image_width(png_ptr, info_ptr);
+ height = png_get_image_height(png_ptr, info_ptr);
+ color_type = png_get_color_type(png_ptr, info_ptr);
+ bit_depth = png_get_bit_depth(png_ptr, info_ptr);
+
+ number_of_passes = png_set_interlace_handling(png_ptr);
+ png_read_update_info(png_ptr, info_ptr);
+
+ /* read file */
+ if (setjmp(png_jmpbuf(png_ptr)))
+ abort_("[read_png_file] Error during read_image");
+
+ row_pointers = (png_bytep *)malloc(sizeof(png_bytep) * height);
+ for (y = 0; y < height; y++)
+ row_pointers[y] = (png_byte *)malloc(png_get_rowbytes(png_ptr, info_ptr));
+
+ png_read_image(png_ptr, row_pointers);
+
+ fclose(fp);
+}
+
+void write_png_file(char *file_name)
+{
+ /* create file */
+ FILE *fp = fopen(file_name, "wb");
+ if (!fp)
+ abort_("[write_png_file] File %s could not be opened for writing", file_name);
+
+ /* initialize stuff */
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+
+ if (!png_ptr)
+ abort_("[write_png_file] png_create_write_struct failed");
+
+ info_ptr = png_create_info_struct(png_ptr);
+ if (!info_ptr)
+ abort_("[write_png_file] png_create_info_struct failed");
+
+ if (setjmp(png_jmpbuf(png_ptr)))
+ abort_("[write_png_file] Error during init_io");
+
+ png_init_io(png_ptr, fp);
+
+ /* write header */
+ if (setjmp(png_jmpbuf(png_ptr)))
+ abort_("[write_png_file] Error during writing header");
+
+ png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE,
+ PNG_FILTER_TYPE_BASE);
+
+ png_write_info(png_ptr, info_ptr);
+
+ /* write bytes */
+ if (setjmp(png_jmpbuf(png_ptr)))
+ abort_("[write_png_file] Error during writing bytes");
+
+ png_write_image(png_ptr, row_pointers);
+
+ /* end write */
+ if (setjmp(png_jmpbuf(png_ptr)))
+ abort_("[write_png_file] Error during end of write");
+
+ png_write_end(png_ptr, NULL);
+
+ /* cleanup heap allocation */
+ for (y = 0; y < height; y++)
+ free(row_pointers[y]);
+ free(row_pointers);
+
+ fclose(fp);
+}
+
+static void swap_colors(void)
+{
+ for (x = 0; x < width; x++) {
+ for (y = 0; y < height; y++) {
+ png_byte *row = row_pointers[y];
+ png_byte *ptr = &(row[x * 4]);
+
+ /* set red value to 0 and green value to the blue one */
+ ptr[0] = 0;
+ ptr[1] = ptr[2];
+ }
+ }
+}
+
+
+static void process_file(void)
+{
+ if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB)
+ abort_("[process_file] input file is PNG_COLOR_TYPE_RGB but must be PNG_COLOR_TYPE_RGBA "
+ "(lacks the alpha channel)");
+
+ if (png_get_color_type(png_ptr, info_ptr) != PNG_COLOR_TYPE_RGBA)
+ abort_("[process_file] color_type of input file must be PNG_COLOR_TYPE_RGBA (%d) (is %d)", PNG_COLOR_TYPE_RGBA,
+ png_get_color_type(png_ptr, info_ptr));
+
+ swap_colors();
+}
+
+int main(int argc, char **argv)
+{
+ if (argc != 3)
+ abort_("Usage: program_name <file_in> <file_out>");
+
+ read_png_file(argv[1]);
+ process_file();
+ write_png_file(argv[2]);
+
+ return 0;
+}
diff --git a/lab-data/debugging/nfsroot/root/app_profiling/tux.png b/lab-data/debugging/nfsroot/root/app_profiling/tux.png
new file mode 100644
index 00000000..d609663f
Binary files /dev/null and b/lab-data/debugging/nfsroot/root/app_profiling/tux.png differ
diff --git a/labs/debugging-application-profiling/debugging-application-profiling.tex b/labs/debugging-application-profiling/debugging-application-profiling.tex
index 307bad23..4db1ce7e 100644
--- a/labs/debugging-application-profiling/debugging-application-profiling.tex
+++ b/labs/debugging-application-profiling/debugging-application-profiling.tex
@@ -52,9 +52,15 @@ tools.
In order to profile the application using the \code{callgrind} tool. Our program
takes two parameters, an input png and an output one. We provided a
-\code{tux.png} which can be used as an input file.
+\code{tux.png} which can be used as an input file. First let's compile it using
+the following commands:
-We are going to profile cache usage using Cachegrind with the following command
+\begin{bashinput}
+$ cd /home/<user>/debugging-labs/nfsroot/root/app_profiling
+$ make
+\end{bashinput}
+
+We are going to profile cache usage using Cachegrind with the following command:
\begin{bashinput}
$ valgrind --tool=cachegrind ./png_convert tux.png out.png
More information about the training-materials-updates
mailing list