*
**************************************************************************/
+#ifndef _WIN32
#include <assert.h>
#include <string.h>
#include "os.hpp"
#include "os_string.hpp"
+#include "os_backtrace.hpp"
namespace os {
#ifdef __APPLE__
uint32_t len = size;
if (_NSGetExecutablePath(buf, &len) != 0) {
- *buf = 0;
- return path;
+ // grow buf and retry
+ buf = path.buf(len);
+ _NSGetExecutablePath(buf, &len);
}
len = strlen(buf);
#else
ssize_t len;
len = readlink("/proc/self/exe", buf, size - 1);
- if (len == -1) {
+ if (len <= 0) {
// /proc/self/exe is not available on setuid processes, so fallback to
// /proc/self/cmdline.
int fd = open("/proc/self/cmdline", O_RDONLY);
if (fd >= 0) {
- len = read(fd, buf, size - 1);
+ // buf already includes trailing zero
+ len = read(fd, buf, size);
close(fd);
+ if (len >= 0) {
+ len = strlen(buf);
+ }
}
}
if (len <= 0) {
- snprintf(buf, size, "%i", (int)getpid());
- return path;
+ // fallback to process ID
+ len = snprintf(buf, size, "%i", (int)getpid());
+ if (len >= size) {
+ len = size - 1;
+ }
}
#endif
path.truncate(len);
if (recursion_count) {
log("apitrace: warning: recursion handling signal %i\n", sig);
} else {
- if (gCallback) {
- ++recursion_count;
+ ++recursion_count;
+ if (gCallback)
gCallback();
- --recursion_count;
- }
+ os::dump_backtrace();
+ --recursion_count;
}
struct sigaction *old_action;
} /* namespace os */
+#endif // !defined(_WIN32)