OLD | NEW |
1 // Copyright (c) 2012 Google Inc. | 1 // Copyright (c) 2012 Google Inc. |
2 // All rights reserved. | 2 // All rights reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 13 matching lines...) Expand all Loading... |
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 | 29 |
30 #include "client/linux/log/log.h" | 30 #include "client/linux/log/log.h" |
31 | 31 |
32 #if defined(__ANDROID__) | 32 #if defined(__ANDROID__) |
33 #include <android/log.h> | 33 #include <android/log.h> |
| 34 #include <dlfcn.h> |
34 #else | 35 #else |
35 #include "third_party/lss/linux_syscall_support.h" | 36 #include "third_party/lss/linux_syscall_support.h" |
36 #endif | 37 #endif |
37 | 38 |
38 namespace logger { | 39 namespace logger { |
39 | 40 |
| 41 #if defined(__ANDROID__) |
| 42 namespace { |
| 43 |
| 44 // __android_log_buf_write() is not exported in the NDK and is being used by |
| 45 // dynamic runtime linking. Its declaration is taken from Android's |
| 46 // system/core/include/log/log.h. |
| 47 using AndroidLogBufferWriteFunc = int (*)(int bufID, int prio, const char *tag, |
| 48 const char *text); |
| 49 const int kAndroidCrashLogId = 4; // From LOG_ID_CRASH in log.h. |
| 50 const char kAndroidLogTag[] = "google-breakpad"; |
| 51 |
| 52 bool g_crash_log_initialized = false; |
| 53 AndroidLogBufferWriteFunc g_android_log_buf_write = nullptr; |
| 54 |
| 55 } // namespace |
| 56 |
| 57 void initializeCrashLogWriter() { |
| 58 if (g_crash_log_initialized) |
| 59 return; |
| 60 g_android_log_buf_write = reinterpret_cast<AndroidLogBufferWriteFunc>( |
| 61 dlsym(RTLD_DEFAULT, "__android_log_buf_write")); |
| 62 g_crash_log_initialized = true; |
| 63 } |
| 64 |
| 65 int writeToCrashLog(const char* buf) { |
| 66 // Try writing to the crash log ring buffer. If not available, fall back to |
| 67 // the standard log buffer. |
| 68 if (g_android_log_buf_write) { |
| 69 return g_android_log_buf_write(kAndroidCrashLogId, ANDROID_LOG_FATAL, |
| 70 kAndroidLogTag, buf); |
| 71 } |
| 72 return __android_log_write(ANDROID_LOG_FATAL, kAndroidLogTag, buf); |
| 73 } |
| 74 #endif |
| 75 |
40 int write(const char* buf, size_t nbytes) { | 76 int write(const char* buf, size_t nbytes) { |
41 #if defined(__ANDROID__) | 77 #if defined(__ANDROID__) |
42 return __android_log_write(ANDROID_LOG_WARN, "google-breakpad", buf); | 78 return __android_log_write(ANDROID_LOG_WARN, kAndroidLogTag, buf); |
43 #else | 79 #else |
44 return sys_write(2, buf, nbytes); | 80 return sys_write(2, buf, nbytes); |
45 #endif | 81 #endif |
46 } | 82 } |
47 | 83 |
48 } // namespace logger | 84 } // namespace logger |
OLD | NEW |