Chromium Code Reviews| Index: third_party/crazy_linker/crazy_linker/src/crazy_linker_debug.cpp |
| diff --git a/third_party/crazy_linker/crazy_linker/src/crazy_linker_debug.cpp b/third_party/crazy_linker/crazy_linker/src/crazy_linker_debug.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..352fb7c5b6318de52d5dcf0a58d686e3f1f3a1b2 |
| --- /dev/null |
| +++ b/third_party/crazy_linker/crazy_linker/src/crazy_linker_debug.cpp |
| @@ -0,0 +1,66 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "crazy_linker_debug.h" |
| + |
| +#include <errno.h> |
| +#include <string.h> |
| + |
| +#ifdef __ANDROID__ |
| +#include <android/log.h> |
| +#endif |
| +#include <stdarg.h> |
| +#include <stdio.h> |
| + |
| +namespace crazy { |
| + |
| +#if CRAZY_DEBUG |
| + |
| +namespace { |
| + |
| +void LogArgs(const char* fmt, va_list args, bool print_error, int error) { |
| + char buffer[4096]; |
|
bulach
2013/09/09 16:14:15
is the stack big enough at this depth?
perhaps all
digit1
2013/09/10 09:23:30
I have no reason to think that the stack would be
|
| + int ret; |
| + |
| + ret = vsnprintf(buffer, sizeof(buffer), fmt, args); |
| + if (ret >= static_cast<int>(sizeof(buffer))) |
| + ret = static_cast<int>(sizeof(buffer)) - 1; |
| + |
| + if (print_error) { |
| + strlcat(buffer, ": ", sizeof(buffer)); |
| + strlcat(buffer, strerror(error), sizeof(buffer)); |
| + } |
| + |
| + // First, send to stderr. |
| + fprintf(stderr, "%.*s", ret, buffer); |
| + |
| +#ifdef __ANDROID__ |
| + // Then to the Android log. |
| + __android_log_write(ANDROID_LOG_INFO, "crazy_linker", buffer); |
| +#endif |
| +} |
| + |
| +} // namespace |
| + |
| +void Log(const char* fmt, ...) { |
| + int old_errno = errno; |
| + va_list args; |
| + va_start(args, fmt); |
| + LogArgs(fmt, args, false, -1); |
| + va_end(args); |
| + errno = old_errno; |
| +} |
| + |
| +void LogErrno(const char* fmt, ...) { |
| + int old_errno = errno; |
| + va_list args; |
| + va_start(args, fmt); |
| + LogArgs(fmt, args, true, old_errno); |
| + va_end(args); |
| + errno = old_errno; |
| +} |
| + |
| +#endif // CRAZY_DEBUG |
| + |
| +} // namespace crazy |