Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010, Google Inc. | 1 // Copyright (c) 2010, 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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 65 | 65 |
| 66 typedef __typeof__(((elf_aux_entry*) 0)->a_un.a_val) elf_aux_val_t; | 66 typedef __typeof__(((elf_aux_entry*) 0)->a_un.a_val) elf_aux_val_t; |
| 67 | 67 |
| 68 // When we find the VDSO mapping in the process's address space, this | 68 // When we find the VDSO mapping in the process's address space, this |
| 69 // is the name we use for it when writing it to the minidump. | 69 // is the name we use for it when writing it to the minidump. |
| 70 // This should always be less than NAME_MAX! | 70 // This should always be less than NAME_MAX! |
| 71 const char kLinuxGateLibraryName[] = "linux-gate.so"; | 71 const char kLinuxGateLibraryName[] = "linux-gate.so"; |
| 72 | 72 |
| 73 class LinuxDumper { | 73 class LinuxDumper { |
| 74 public: | 74 public: |
| 75 explicit LinuxDumper(pid_t pid); | 75 // The |root_prefix| is prepended to mapping paths before opening them, which |
| 76 // is useful if the crash originates from a chroot. | |
| 77 explicit LinuxDumper(pid_t pid, const char* root_prefix = ""); | |
|
Luis Héctor Chávez
2016/03/03 22:10:43
The style guide seems to be slightly against defau
Dominik Laskowski
2016/03/04 01:03:15
I think this is more readable, since overloads wou
| |
| 76 | 78 |
| 77 virtual ~LinuxDumper(); | 79 virtual ~LinuxDumper(); |
| 78 | 80 |
| 79 // Parse the data for |threads| and |mappings|. | 81 // Parse the data for |threads| and |mappings|. |
| 80 virtual bool Init(); | 82 virtual bool Init(); |
| 81 | 83 |
| 82 // Take any actions that could not be taken in Init(). LateInit() is | 84 // Take any actions that could not be taken in Init(). LateInit() is |
| 83 // called after all other caller's initialization is complete, and in | 85 // called after all other caller's initialization is complete, and in |
| 84 // particular after it has called ThreadsSuspend(), so that ptrace is | 86 // particular after it has called ThreadsSuspend(), so that ptrace is |
| 85 // available. | 87 // available. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 133 void set_crash_address(uintptr_t crash_address) { | 135 void set_crash_address(uintptr_t crash_address) { |
| 134 crash_address_ = crash_address; | 136 crash_address_ = crash_address; |
| 135 } | 137 } |
| 136 | 138 |
| 137 int crash_signal() const { return crash_signal_; } | 139 int crash_signal() const { return crash_signal_; } |
| 138 void set_crash_signal(int crash_signal) { crash_signal_ = crash_signal; } | 140 void set_crash_signal(int crash_signal) { crash_signal_ = crash_signal; } |
| 139 | 141 |
| 140 pid_t crash_thread() const { return crash_thread_; } | 142 pid_t crash_thread() const { return crash_thread_; } |
| 141 void set_crash_thread(pid_t crash_thread) { crash_thread_ = crash_thread; } | 143 void set_crash_thread(pid_t crash_thread) { crash_thread_ = crash_thread; } |
| 142 | 144 |
| 145 // Concatenates the |root_prefix_| and |mapping| path. Writes into |path| and | |
| 146 // returns true unless the string is too long. | |
| 147 bool GetMappingAbsolutePath(const MappingInfo& mapping, | |
| 148 char path[PATH_MAX]) const; | |
| 149 | |
| 143 // Extracts the effective path and file name of from |mapping|. In most cases | 150 // Extracts the effective path and file name of from |mapping|. In most cases |
| 144 // the effective name/path are just the mapping's path and basename. In some | 151 // the effective name/path are just the mapping's path and basename. In some |
| 145 // other cases, however, a library can be mapped from an archive (e.g., when | 152 // other cases, however, a library can be mapped from an archive (e.g., when |
| 146 // loading .so libs from an apk on Android) and this method is able to | 153 // loading .so libs from an apk on Android) and this method is able to |
| 147 // reconstruct the original file name. | 154 // reconstruct the original file name. |
| 148 static void GetMappingEffectiveNameAndPath(const MappingInfo& mapping, | 155 void GetMappingEffectiveNameAndPath(const MappingInfo& mapping, |
| 149 char* file_path, | 156 char* file_path, |
| 150 size_t file_path_size, | 157 size_t file_path_size, |
| 151 char* file_name, | 158 char* file_name, |
| 152 size_t file_name_size); | 159 size_t file_name_size); |
| 153 | 160 |
| 154 protected: | 161 protected: |
| 155 bool ReadAuxv(); | 162 bool ReadAuxv(); |
| 156 | 163 |
| 157 virtual bool EnumerateMappings(); | 164 virtual bool EnumerateMappings(); |
| 158 | 165 |
| 159 virtual bool EnumerateThreads() = 0; | 166 virtual bool EnumerateThreads() = 0; |
| 160 | 167 |
| 161 // For the case where a running program has been deleted, it'll show up in | 168 // For the case where a running program has been deleted, it'll show up in |
| 162 // /proc/pid/maps as "/path/to/program (deleted)". If this is the case, then | 169 // /proc/pid/maps as "/path/to/program (deleted)". If this is the case, then |
| 163 // see if '/path/to/program (deleted)' matches /proc/pid/exe and return | 170 // see if '/path/to/program (deleted)' matches /proc/pid/exe and return |
| 164 // /proc/pid/exe in |path| so ELF identifier generation works correctly. This | 171 // /proc/pid/exe in |path| so ELF identifier generation works correctly. This |
| 165 // also checks to see if '/path/to/program (deleted)' exists, so it does not | 172 // also checks to see if '/path/to/program (deleted)' exists, so it does not |
| 166 // get fooled by a poorly named binary. | 173 // get fooled by a poorly named binary. |
| 167 // For programs that don't end with ' (deleted)', this is a no-op. | 174 // For programs that don't end with ' (deleted)', this is a no-op. |
| 168 // This assumes |path| is a buffer with length NAME_MAX. | 175 // This assumes |path| is a buffer with length NAME_MAX. |
| 169 // Returns true if |path| is modified. | 176 // Returns true if |path| is modified. |
| 170 bool HandleDeletedFileInMapping(char* path) const; | 177 bool HandleDeletedFileInMapping(char* path) const; |
| 171 | 178 |
| 172 // ID of the crashed process. | 179 // ID of the crashed process. |
| 173 const pid_t pid_; | 180 const pid_t pid_; |
| 174 | 181 |
| 182 // Path of the root directory to which mapping paths are relative. | |
| 183 const char* const root_prefix_; | |
| 184 | |
| 175 // Virtual address at which the process crashed. | 185 // Virtual address at which the process crashed. |
| 176 uintptr_t crash_address_; | 186 uintptr_t crash_address_; |
| 177 | 187 |
| 178 // Signal that terminated the crashed process. | 188 // Signal that terminated the crashed process. |
| 179 int crash_signal_; | 189 int crash_signal_; |
| 180 | 190 |
| 181 // ID of the crashed thread. | 191 // ID of the crashed thread. |
| 182 pid_t crash_thread_; | 192 pid_t crash_thread_; |
| 183 | 193 |
| 184 mutable PageAllocator allocator_; | 194 mutable PageAllocator allocator_; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 245 // (or Chromium crazy linker) used. This value matches the addresses produced | 255 // (or Chromium crazy linker) used. This value matches the addresses produced |
| 246 // when the non-relocation-packed library is used for breakpad symbol | 256 // when the non-relocation-packed library is used for breakpad symbol |
| 247 // generation. | 257 // generation. |
| 248 void LatePostprocessMappings(); | 258 void LatePostprocessMappings(); |
| 249 #endif // __ANDROID__ | 259 #endif // __ANDROID__ |
| 250 }; | 260 }; |
| 251 | 261 |
| 252 } // namespace google_breakpad | 262 } // namespace google_breakpad |
| 253 | 263 |
| 254 #endif // CLIENT_LINUX_HANDLER_LINUX_DUMPER_H_ | 264 #endif // CLIENT_LINUX_HANDLER_LINUX_DUMPER_H_ |
| OLD | NEW |