Skip to content

Commit 22bee2c

Browse files
joyeecheungV8 LUCI CQ
authored andcommitted
[serializer] print reference stack when external reference is unknown
Print the reference stack when V8 is unable to encode an external reference in debug builds so that it's easier for the embedder to track the external reference down. Refs: nodejs/node#38905 Change-Id: Ia86eeb87833d7de0eccc7bc040301c78ddb3240c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2988831 Reviewed-by: Toon Verwaest <verwaest@chromium.org> Commit-Queue: Joyee Cheung <joyee@igalia.com> Cr-Commit-Position: refs/heads/master@{#75546}
1 parent 103f5db commit 22bee2c

2 files changed

Lines changed: 19 additions & 3 deletions

File tree

src/snapshot/serializer.cc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,23 @@ void Serializer::ResolvePendingForwardReference(int forward_reference_id) {
318318
}
319319
}
320320

321+
ExternalReferenceEncoder::Value Serializer::EncodeExternalReference(
322+
Address addr) {
323+
Maybe<ExternalReferenceEncoder::Value> result =
324+
external_reference_encoder_.TryEncode(addr);
325+
if (result.IsNothing()) {
326+
#ifdef DEBUG
327+
PrintStack(std::cerr);
328+
#endif
329+
void* addr_ptr = reinterpret_cast<void*>(addr);
330+
v8::base::OS::PrintError("Unknown external reference %p.\n", addr_ptr);
331+
v8::base::OS::PrintError("%s\n",
332+
ExternalReferenceTable::ResolveSymbol(addr_ptr));
333+
v8::base::OS::Abort();
334+
}
335+
return result.FromJust();
336+
}
337+
321338
void Serializer::RegisterObjectIsPending(Handle<HeapObject> obj) {
322339
if (*obj == ReadOnlyRoots(isolate()).not_mapped_symbol()) return;
323340

src/snapshot/serializer.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,8 @@ class Serializer : public SerializerDeserializer {
244244
// Returns true if the given heap object is a bytecode handler code object.
245245
bool ObjectIsBytecodeHandler(Handle<HeapObject> obj) const;
246246

247-
ExternalReferenceEncoder::Value EncodeExternalReference(Address addr) {
248-
return external_reference_encoder_.Encode(addr);
249-
}
247+
ExternalReferenceEncoder::Value EncodeExternalReference(Address addr);
248+
250249
Maybe<ExternalReferenceEncoder::Value> TryEncodeExternalReference(
251250
Address addr) {
252251
return external_reference_encoder_.TryEncode(addr);

0 commit comments

Comments
 (0)