Go to the documentation of this file.
37 #include <glog/logging.h>
41 #ifdef HAVE_UCONTEXT_H
42 # include <ucontext.h>
44 #ifdef HAVE_SYS_UCONTEXT_H
45 # include <sys/ucontext.h>
62 { SIGSEGV,
"SIGSEGV" },
65 { SIGABRT,
"SIGABRT" },
66 #if !defined(GLOG_OS_WINDOWS)
69 { SIGTERM,
"SIGTERM" },
74 #if !defined(GLOG_OS_WINDOWS)
76 void*
GetPC(
void* ucontext_in_void) {
77 #if (defined(HAVE_UCONTEXT_H) || defined(HAVE_SYS_UCONTEXT_H)) && defined(PC_FROM_UCONTEXT)
78 if (ucontext_in_void !=
NULL) {
79 ucontext_t *context =
reinterpret_cast<ucontext_t *
>(ucontext_in_void);
80 return (
void*)context->PC_FROM_UCONTEXT;
83 (
void)ucontext_in_void;
105 while (
str[
i] !=
'\0' && cursor_ +
i < end_) {
116 while (cursor_ +
i < end_) {
119 cursor_[
i] =
static_cast<char>(tmp < 10 ?
'0' + tmp :
'a' + tmp - 10);
126 std::reverse(cursor_, cursor_ +
i);
133 char*
start = cursor_;
153 if (write(STDERR_FILENO,
data,
size) < 0) {
164 time_t time_in_sec = time(
NULL);
172 formatter.
AppendString(
"\" if you are using GNU date ***\n");
177 #ifdef HAVE_SIGACTION
180 void DumpSignalInfo(
int signal_number, siginfo_t *siginfo) {
182 const char* signal_name =
NULL;
190 MinimalFormatter formatter(
buf,
sizeof(
buf));
192 formatter.AppendString(
"*** ");
194 formatter.AppendString(signal_name);
198 formatter.AppendString(
"Signal ");
199 formatter.AppendUint64(
static_cast<uint64>(signal_number), 10);
201 formatter.AppendString(
" (@0x");
202 formatter.AppendUint64(
reinterpret_cast<uintptr_t
>(siginfo->si_addr), 16);
203 formatter.AppendString(
")");
204 formatter.AppendString(
" received by PID ");
205 formatter.AppendUint64(
static_cast<uint64>(getpid()), 10);
206 formatter.AppendString(
" (TID 0x");
211 pthread_t
id = pthread_self();
212 formatter.AppendUint64(
213 reinterpret_cast<uint64>(
reinterpret_cast<const char*
>(
id)), 16);
214 formatter.AppendString(
") ");
217 formatter.AppendString(
"from PID ");
218 formatter.AppendUint64(
static_cast<uint64>(siginfo->si_pid), 10);
219 formatter.AppendString(
"; ");
221 formatter.AppendString(
"stack trace: ***\n");
225 #endif // HAVE_SIGACTION
230 const char *symbol =
"(unknown)";
231 char symbolized[1024];
234 if (
Symbolize(
reinterpret_cast<char *
>(pc) - 1,
235 symbolized,
sizeof(symbolized))) {
244 const int width = 2 *
sizeof(
void*) + 2;
254 #ifdef HAVE_SIGACTION
255 struct sigaction sig_action;
256 memset(&sig_action, 0,
sizeof(sig_action));
257 sigemptyset(&sig_action.sa_mask);
258 sig_action.sa_handler = SIG_DFL;
259 sigaction(signal_number, &sig_action,
NULL);
260 kill(getpid(), signal_number);
261 #elif defined(GLOG_OS_WINDOWS)
262 signal(signal_number, SIG_DFL);
263 raise(signal_number);
275 #if defined(GLOG_OS_WINDOWS)
279 siginfo_t *signal_info,
289 pthread_t my_thread_id = pthread_self();
295 pthread_t* old_thread_id_pointer =
298 static_cast<pthread_t*
>(
NULL),
300 if (old_thread_id_pointer !=
NULL) {
322 #if !defined(GLOG_OS_WINDOWS)
324 void *pc =
GetPC(ucontext);
328 #ifdef HAVE_STACKTRACE
333 # ifdef HAVE_SIGACTION
334 DumpSignalInfo(signal_number, signal_info);
364 #ifdef HAVE_SIGACTION
366 struct sigaction sig_action;
367 memset(&sig_action, 0,
sizeof(sig_action));
368 sigemptyset(&sig_action.sa_mask);
369 sigaction(SIGABRT,
NULL, &sig_action);
373 #elif defined(GLOG_OS_WINDOWS)
375 #endif // HAVE_SIGACTION
382 #ifdef HAVE_SIGACTION
384 struct sigaction sig_action;
385 memset(&sig_action, 0,
sizeof(sig_action));
386 sigemptyset(&sig_action.sa_mask);
387 sig_action.sa_flags |= SA_SIGINFO;
394 #elif defined(GLOG_OS_WINDOWS)
400 #endif // HAVE_SIGACTION
404 #if defined(HAVE_SIGACTION) || defined(GLOG_OS_WINDOWS)
406 #endif // HAVE_SIGACTION
409 _END_GOOGLE_NAMESPACE_
void * GetPC(void *ucontext_in_void)
void(* g_failure_writer)(const char *data, size_t size)
_START_GOOGLE_NAMESPACE_ bool Symbolize(void *, char *, size_t)
void FlushLogFilesUnsafe(LogSeverity min_severity)
static bool kFailureSignalHandlerInstalled
_START_GOOGLE_NAMESPACE_ GLOG_EXPORT int GetStackTrace(void **result, int max_depth, int skip_count)
void InstallFailureWriter(void(*writer)(const char *data, size_t size))
bool IsFailureSignalHandlerInstalled()
static pthread_t * g_entered_thread_id_pointer
static const char prefix[]
void FailureSignalHandler(int signal_number, siginfo_t *signal_info, void *ucontext)
void InstallFailureSignalHandler()
GLenum GLuint GLenum GLsizei const GLchar * buf
GLint GLint GLsizei GLsizei GLsizei depth
static void WriteToStderr(const char *message, size_t len)
const struct _START_GOOGLE_NAMESPACE_::@18 kFailureSignals[]
typedef void(APIENTRY *GLDEBUGPROCARB)(GLenum source
void DumpStackFrameInfo(const char *prefix, void *pc)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
static uint8 buffer_[kBufferSize]
void InvokeDefaultSignalHandler(int signal_number)
T sync_val_compare_and_swap(T *ptr, T oldval, T newval)
libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:58