diff --git a/components/crashcatcher/crashcatcher.cpp b/components/crashcatcher/crashcatcher.cpp index 7f8f27c442..0fa6b0fe47 100644 --- a/components/crashcatcher/crashcatcher.cpp +++ b/components/crashcatcher/crashcatcher.cpp @@ -131,7 +131,7 @@ namespace } } -static void gdb_info(pid_t pid) +static void printGdbInfo(pid_t pid) { /* * Create a temp file to put gdb commands into. @@ -141,13 +141,24 @@ static void gdb_info(pid_t pid) */ char respfile[64] = "/tmp/gdb-respfile-XXXXXX"; - FILE* f; - int fd; - #ifdef __COVERITY__ umask(0600); #endif - if ((fd = mkstemp(respfile)) >= 0 && (f = fdopen(fd, "w")) != nullptr) + + const int fd = mkstemp(respfile); + if (fd == -1) + { + printf("Failed to call mkstemp: %s\n", std::generic_category().message(errno).c_str()); + return; + } + + FILE* const f = fdopen(fd, "w"); + if (f == nullptr) + { + printf("Failed to open file for gdb output \"%s\": %s\n", respfile, + std::generic_category().message(errno).c_str()); + } + else { fprintf(f, "attach %d\n" @@ -179,33 +190,24 @@ static void gdb_info(pid_t pid) int ret = system(cmd_buf); - if (ret != 0) + if (ret == -1) printf( - "\nFailed to create a crash report. Please make sure that 'gdb' is installed and present in PATH then " - "crash again." - "\nCurrent PATH: %s\n", + "\nFailed to create a crash report: %s.\n" + "Please make sure that 'gdb' is installed and present in PATH then crash again.\n" + "Current PATH: %s\n", + std::generic_category().message(errno).c_str(), getenv("PATH")); + else if (ret != 0) + printf( + "\nFailed to create a crash report.\n" + "Please make sure that 'gdb' is installed and present in PATH then crash again.\n" + "Current PATH: %s\n", getenv("PATH")); - fflush(stdout); - /* Clean up */ - if (remove(respfile) != 0) - Log(Debug::Warning) << "Warning: can not remove file '" << respfile - << "': " << std::generic_category().message(errno); - } - else - { - /* Error creating temp file */ - if (fd >= 0) - { - if (close(fd) != 0) - Log(Debug::Warning) << "Warning: can not close file '" << respfile - << "': " << std::generic_category().message(errno); - else if (remove(respfile) != 0) - Log(Debug::Warning) << "Warning: can not remove file '" << respfile - << "': " << std::generic_category().message(errno); - } - printf("!!! Could not create gdb command file\n"); + fflush(stdout); } + + close(fd); + remove(respfile); fflush(stdout); } @@ -365,7 +367,7 @@ static void crash_catcher(int signum, siginfo_t* siginfo, void* /*context*/) if (crash_info.pid > 0) { - gdb_info(crash_info.pid); + printGdbInfo(crash_info.pid); kill(crash_info.pid, SIGKILL); }