Index: src/snapshot/serializer-common.cc |
diff --git a/src/snapshot/serializer-common.cc b/src/snapshot/serializer-common.cc |
index f18879341931465f456bf36095ac0d84262d0375..d42c3061e6f5fd3596617161a81e64bb0b372a91 100644 |
--- a/src/snapshot/serializer-common.cc |
+++ b/src/snapshot/serializer-common.cc |
@@ -8,21 +8,25 @@ |
#include "src/ic/stub-cache.h" |
#include "src/list-inl.h" |
+#if defined(DEBUG) && defined(V8_OS_LINUX) && !defined(V8_OS_ANDROID) |
+#define SYMBOLIZE_FUNCTION |
+#include <execinfo.h> |
+#endif // DEBUG && V8_OS_LINUX && !V8_OS_ANDROID |
+ |
namespace v8 { |
namespace internal { |
ExternalReferenceEncoder::ExternalReferenceEncoder(Isolate* isolate) { |
map_ = isolate->external_reference_map(); |
-#ifdef DEBUG |
- table_ = ExternalReferenceTable::instance(isolate); |
-#endif // DEBUG |
if (map_ != nullptr) return; |
map_ = new AddressToIndexHashMap(); |
ExternalReferenceTable* table = ExternalReferenceTable::instance(isolate); |
for (uint32_t i = 0; i < table->size(); ++i) { |
Address addr = table->address(i); |
- DCHECK(map_->Get(addr).IsNothing() || |
- strncmp(table->name(i), "Redirect to ", 12) == 0); |
+ // We expect no duplicate external references entries in the table. |
+ // AccessorRefTable getter may have duplicates, indicated by an empty string |
+ // as name. |
+ DCHECK(table->name(i)[0] == '\0' || map_->Get(addr).IsNothing()); |
map_->Set(addr, i); |
DCHECK(map_->Get(addr).IsJust()); |
} |
@@ -32,14 +36,13 @@ |
uint32_t ExternalReferenceEncoder::Encode(Address address) const { |
Maybe<uint32_t> maybe_index = map_->Get(address); |
if (maybe_index.IsNothing()) { |
- void* addr = address; |
- v8::base::OS::PrintError("Unknown external reference %p.\n", addr); |
- v8::base::OS::PrintError("%s", ExternalReferenceTable::ResolveSymbol(addr)); |
+ void* function_addr = address; |
+ v8::base::OS::PrintError("Unknown external reference %p.\n", function_addr); |
+#ifdef SYMBOLIZE_FUNCTION |
+ v8::base::OS::PrintError("%s\n", backtrace_symbols(&function_addr, 1)[0]); |
+#endif // SYMBOLIZE_FUNCTION |
v8::base::OS::Abort(); |
} |
-#ifdef DEBUG |
- table_->increment_count(maybe_index.FromJust()); |
-#endif // DEBUG |
return maybe_index.FromJust(); |
} |