[TF2XLA] Fix a segfault in propagating stack traces in XlaKernelCreator

The node might not be alive when we are showing the stack trace

PiperOrigin-RevId: 348503788
Change-Id: I80e9e6fa3f10aea7841a4d3bfad51b6a9854edb7
This commit is contained in:
George Karpenkov 2020-12-21 11:54:36 -08:00 committed by TensorFlower Gardener
parent 74cda1cdde
commit 7790cd6c2f
3 changed files with 12 additions and 10 deletions

View File

@ -152,10 +152,11 @@ RecursiveCompilabilityChecker::FindUncompilableNodes(
if (node_stack_trace != nullptr) {
for (const auto& frame : *node_stack_trace) {
stack_trace.emplace_back(
StackFrameView{frame.name, frame.function_name, frame.n});
StackFrameView{frame.name, frame.function_name, frame.stack_trace});
}
}
stack_trace.emplace_back(StackFrameView{node.name(), "", &node});
stack_trace.emplace_back(
StackFrameView{node.name(), "", node.GetStackTrace()});
RecursiveCompilabilityChecker::UncompilableNodesMap uncompilable_nodes;
IsCompilableNode(node, lib_runtime, &stack_trace,
@ -175,7 +176,7 @@ RecursiveCompilabilityChecker::FindUncompilableNodes(
if (node_stack_trace != nullptr) {
for (const auto& frame : *node_stack_trace) {
stack_trace.emplace_back(
StackFrameView{frame.name, frame.function_name, frame.n});
StackFrameView{frame.name, frame.function_name, frame.stack_trace});
}
}
stack_trace.emplace_back(StackFrameView{call_def.name(), "", nullptr});
@ -361,7 +362,7 @@ bool RecursiveCompilabilityChecker::IsCompilableCall(
bool is_compilable = true;
for (const Node* node : fbody->graph->op_nodes()) {
stack_trace->emplace_back(
StackFrameView{node->name(), function.name(), node});
StackFrameView{node->name(), function.name(), node->GetStackTrace()});
is_compilable &= IsCompilableNode(*node, lib_runtime, stack_trace,
&function, uncompilable_nodes);
stack_trace->pop_back();
@ -586,7 +587,7 @@ RecursiveCompilabilityChecker::OperationFilter CreateOperationFilter(
return StackFrame{
std::string(stack_element.name),
std::string(stack_element.function_name),
stack_element.n};
stack_element.stack_trace};
});
node_info.name = std::string(stack_trace.back().name);

View File

@ -62,7 +62,7 @@ class RecursiveCompilabilityChecker {
struct StackFrame {
std::string name;
std::string function_name;
const Node* n = nullptr;
std::shared_ptr<AbstractStackTrace> stack_trace;
};
// Contains information about uncompilable node inside a function body.
@ -197,7 +197,7 @@ class RecursiveCompilabilityChecker {
struct StackFrameView {
absl::string_view name;
absl::string_view function_name;
const Node* n = nullptr;
std::shared_ptr<AbstractStackTrace> stack_trace;
};
bool IsCompilableNode(

View File

@ -123,13 +123,14 @@ static Status CreateXlaKernel(FunctionLibraryRuntime* flr,
std::string node_message = absl::StrCat(
"\n", node_info.name, ": ", node_info.uncompilable_reason, "\n",
"The op is created at:\n");
const Node* n = node_info.stack_trace.back().n;
if (n && n->GetStackTrace()) {
if (node_info.stack_trace.back().stack_trace) {
AbstractStackTrace::TracePrintingOptions opts;
opts.show_line_contents = true;
opts.filter_common_prefix = true;
opts.drop_internal_frames = true;
absl::StrAppend(&node_message, n->GetStackTrace()->ToString(opts));
absl::StrAppend(
&node_message,
node_info.stack_trace.back().stack_trace->ToString(opts));
} else {
absl::StrAppend(&node_message, "<Unavailable>\n");
}