OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 void OS::DebugBreak() { | 189 void OS::DebugBreak() { |
190 #if (defined(__arm__) || defined(__thumb__)) | 190 #if (defined(__arm__) || defined(__thumb__)) |
191 asm("bkpt 0"); | 191 asm("bkpt 0"); |
192 #else | 192 #else |
193 asm("int $3"); | 193 asm("int $3"); |
194 #endif | 194 #endif |
195 } | 195 } |
196 | 196 |
197 | 197 |
198 void OS::DumpBacktrace() { | 198 void OS::DumpBacktrace() { |
199 void* trace[100]; | 199 POSIXBacktraceHelper<backtrace, backtrace_symbols>::DumpBacktrace(); |
200 int size = backtrace(trace, ARRAY_SIZE(trace)); | |
201 char** symbols = backtrace_symbols(trace, size); | |
202 fprintf(stderr, "\n==== C stack trace ===============================\n\n"); | |
203 if (size == 0) { | |
204 fprintf(stderr, "(empty)\n"); | |
205 } else if (symbols == NULL) { | |
206 fprintf(stderr, "(no symbols)\n"); | |
207 } else { | |
208 for (int i = 1; i < size; ++i) { | |
209 fprintf(stderr, "%2d: ", i); | |
210 char mangled[201]; | |
211 if (sscanf(symbols[i], "%*[^(]%*[(]%200[^)+]", mangled) == 1) { // NOLINT | |
212 fprintf(stderr, "%s\n", mangled); | |
213 } else { | |
214 fprintf(stderr, "??\n"); | |
215 } | |
216 } | |
217 } | |
218 fflush(stderr); | |
219 free(symbols); | |
220 } | 200 } |
221 | 201 |
222 | 202 |
223 class PosixMemoryMappedFile : public OS::MemoryMappedFile { | 203 class PosixMemoryMappedFile : public OS::MemoryMappedFile { |
224 public: | 204 public: |
225 PosixMemoryMappedFile(FILE* file, void* memory, int size) | 205 PosixMemoryMappedFile(FILE* file, void* memory, int size) |
226 : file_(file), memory_(memory), size_(size) { } | 206 : file_(file), memory_(memory), size_(size) { } |
227 virtual ~PosixMemoryMappedFile(); | 207 virtual ~PosixMemoryMappedFile(); |
228 virtual void* memory() { return memory_; } | 208 virtual void* memory() { return memory_; } |
229 virtual int size() { return size_; } | 209 virtual int size() { return size_; } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 } | 291 } |
312 close(fd); | 292 close(fd); |
313 } | 293 } |
314 | 294 |
315 | 295 |
316 void OS::SignalCodeMovingGC() { | 296 void OS::SignalCodeMovingGC() { |
317 } | 297 } |
318 | 298 |
319 | 299 |
320 int OS::StackWalk(Vector<OS::StackFrame> frames) { | 300 int OS::StackWalk(Vector<OS::StackFrame> frames) { |
321 int frames_size = frames.length(); | 301 return POSIXBacktraceHelper<backtrace, backtrace_symbols>::StackWalk(frames); |
322 ScopedVector<void*> addresses(frames_size); | |
323 | |
324 int frames_count = backtrace(addresses.start(), frames_size); | |
325 | |
326 char** symbols = backtrace_symbols(addresses.start(), frames_count); | |
327 if (symbols == NULL) { | |
328 return kStackWalkError; | |
329 } | |
330 | |
331 for (int i = 0; i < frames_count; i++) { | |
332 frames[i].address = addresses[i]; | |
333 // Format a text representation of the frame based on the information | |
334 // available. | |
335 SNPrintF(MutableCStrVector(frames[i].text, kStackWalkMaxTextLen), | |
336 "%s", | |
337 symbols[i]); | |
338 // Make sure line termination is in place. | |
339 frames[i].text[kStackWalkMaxTextLen - 1] = '\0'; | |
340 } | |
341 | |
342 free(symbols); | |
343 | |
344 return frames_count; | |
345 } | 302 } |
346 | 303 |
347 | 304 |
348 // Constants used for mmap. | 305 // Constants used for mmap. |
349 static const int kMmapFd = -1; | 306 static const int kMmapFd = -1; |
350 static const int kMmapFdOffset = 0; | 307 static const int kMmapFdOffset = 0; |
351 | 308 |
352 | 309 |
353 VirtualMemory::VirtualMemory() : address_(NULL), size_(0) { } | 310 VirtualMemory::VirtualMemory() : address_(NULL), size_(0) { } |
354 | 311 |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 limit_mutex = CreateMutex(); | 592 limit_mutex = CreateMutex(); |
636 } | 593 } |
637 | 594 |
638 | 595 |
639 void OS::TearDown() { | 596 void OS::TearDown() { |
640 delete limit_mutex; | 597 delete limit_mutex; |
641 } | 598 } |
642 | 599 |
643 | 600 |
644 } } // namespace v8::internal | 601 } } // namespace v8::internal |
OLD | NEW |