aboutsummaryrefslogtreecommitdiff
path: root/print_status_on_exit.c
diff options
context:
space:
mode:
Diffstat (limited to 'print_status_on_exit.c')
-rw-r--r--print_status_on_exit.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/print_status_on_exit.c b/print_status_on_exit.c
new file mode 100644
index 0000000..686817e
--- /dev/null
+++ b/print_status_on_exit.c
@@ -0,0 +1,100 @@
+#define _GNU_SOURCE
+#include <dlfcn.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+char tmpbuff[1024];
+unsigned long tmppos = 0;
+unsigned long tmpallocs = 0;
+
+/*=========================================================
+ * * interception points
+ * */
+
+static void * (*myfn_malloc)(size_t size);
+static void (*myfn_free)(void *ptr);
+
+static void print_status(void)
+{
+ char buf[4096];
+
+ FILE* status = fopen("/proc/self/status", "r");
+ if (status == NULL)
+ {
+ perror("fopen status");
+ exit(1);
+ }
+
+ FILE* output = fopen("status", "w");
+ if (output == NULL)
+ {
+ perror("fopen output file");
+ exit(1);
+ }
+
+ while (!feof(status))
+ {
+ fgets(&buf, 4096, status);
+ fprintf(output, "%s", buf);
+ }
+ fclose(status);
+}
+
+static void init()
+{
+ myfn_malloc = dlsym(RTLD_NEXT, "malloc");
+ myfn_free = dlsym(RTLD_NEXT, "free");
+
+ if (!myfn_malloc || !myfn_free)
+ {
+ fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());
+ exit(1);
+ }
+ atexit(print_status);
+}
+
+void *malloc(size_t size)
+{
+ static int initializing = 0;
+ if (myfn_malloc == NULL)
+ {
+ if (!initializing)
+ {
+ initializing = 1;
+ init();
+ initializing = 0;
+
+ fprintf(stdout, "jcheck: allocated %lu bytes of temp memory in %lu chunks during initialization\n", tmppos, tmpallocs);
+ }
+ else
+ {
+ if (tmppos + size < sizeof(tmpbuff))
+ {
+ void *retptr = tmpbuff + tmppos;
+ tmppos += size;
+ ++tmpallocs;
+ return retptr;
+ }
+ else
+ {
+ fprintf(stdout, "jcheck: too much memory requested during initialisation - increase tmpbuff size\n");
+ exit(1);
+ }
+ }
+ }
+
+ return myfn_malloc(size);
+}
+
+void free(void *ptr)
+{
+ // something wrong if we call free before one of the allocators!
+ if (myfn_malloc == NULL)
+ init();
+ if (ptr >= (void*) tmpbuff && ptr <= (void*)(tmpbuff + tmppos))
+ fprintf(stdout, "freeing temp memory\n");
+ else
+ myfn_free(ptr);
+}
+