From 03f028d9250d88550a6c32b7af5644bc74252e3a Mon Sep 17 00:00:00 2001 From: "Peter W. Draper" <p.w.draper@durham.ac.uk> Date: Tue, 19 Mar 2019 20:34:36 +0000 Subject: [PATCH] Make error report about memory use more interesting by keeping a record of the failed allocation, also keep one error dump per rank (stop overwrites) --- src/error.h | 2 +- src/memuse.c | 14 ++++++++++++++ src/memuse.h | 15 +++++++++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/error.h b/src/error.h index ee9a6765b6..de4e9fa44c 100644 --- a/src/error.h +++ b/src/error.h @@ -46,7 +46,7 @@ /* If reporting memory usage, try to dump that when exiting in error. */ #ifdef SWIFT_MEMUSE_REPORTS -#define memdump(rank) memuse_log_dump("memuse-error-report.txt"); +#define memdump(rank) memuse_log_dump_error(rank); #else #define memdump(rank) #endif diff --git a/src/memuse.c b/src/memuse.c index 02b5334c69..0c74bea4ed 100644 --- a/src/memuse.c +++ b/src/memuse.c @@ -146,6 +146,8 @@ void memuse_log_allocation(const char *label, void *ptr, int allocated, /** * @brief dump the log to a file and reset, if anything to dump. + * + * @param filename name of file for log dump. */ void memuse_log_dump(const char *filename) { @@ -176,6 +178,18 @@ void memuse_log_dump(const char *filename) { fclose(fd); } +/** + * @brief dump the log for using the given rank to generate a standard + * name for the output. Used when exiting in error. + * + * @param rank the rank exiting in error. + */ +void memuse_log_dump_error(int rank) { + char filename[60]; + sprintf(filename, "memuse-error-report-rank%d.txt", rank); + memuse_log_dump(filename); +} + #endif /* SWIFT_MEMUSE_REPORTS */ /** diff --git a/src/memuse.h b/src/memuse.h index e9bb16733c..7df4a2efb8 100644 --- a/src/memuse.h +++ b/src/memuse.h @@ -32,6 +32,7 @@ const char *memuse_process(int inmb); #ifdef SWIFT_MEMUSE_REPORTS void memuse_log_dump(const char *filename); +void memuse_log_dump_error(int rank); void memuse_log_allocation(const char *label, void *ptr, int allocated, size_t size); #else @@ -57,7 +58,12 @@ __attribute__((always_inline)) inline int swift_memalign(const char *label, size_t size) { int result = posix_memalign(memptr, alignment, size); #ifdef SWIFT_MEMUSE_REPORTS - if (result == 0) memuse_log_allocation(label, *memptr, 1, size); + if (result == 0) { + memuse_log_allocation(label, *memptr, 1, size); + } else { + /* Failed allocations are interesting as well. */ + memuse_log_allocation(label, NULL, 1, size); + } #endif return result; } @@ -77,7 +83,12 @@ __attribute__((always_inline)) inline void *swift_malloc(const char *label, size_t size) { void *memptr = malloc(size); #ifdef SWIFT_MEMUSE_REPORTS - if (memptr != NULL) memuse_log_allocation(label, memptr, 1, size); + if (memptr != NULL) { + memuse_log_allocation(label, memptr, 1, size); + } else { + /* Failed allocations are interesting as well. */ + memuse_log_allocation(label, NULL, 1, size); + } #endif return memptr; } -- GitLab