
For an exception crashlog, the thread backtraces aren't usually very helpful and instead, developpers look at the "Application Specific Backtrace" that was generated by `objc_exception_throw`. LLDB could already parse and symbolicate these Application Specific Backtraces for regular textual-based crashlog, so this patch adds support to parse them in JSON crashlogs, and materialize them a HistoryThread extending the crashed ScriptedThread. This patch also includes the Application Specific Information messages as part of the process extended crash information log. To do so, the ScriptedProcess Python interface has a new GetMetadata method that returns an arbitrary dictionary with data related to the process. rdar://93207586 Differential Revision: https://reviews.llvm.org/D126260 Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
81 lines
2.4 KiB
C++
81 lines
2.4 KiB
C++
//===-- ScriptedThread.h ----------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_SOURCE_PLUGINS_SCRIPTED_THREAD_H
|
|
#define LLDB_SOURCE_PLUGINS_SCRIPTED_THREAD_H
|
|
|
|
#include <string>
|
|
|
|
#include "ScriptedProcess.h"
|
|
|
|
#include "Plugins/Process/Utility/RegisterContextMemory.h"
|
|
#include "lldb/Interpreter/ScriptInterpreter.h"
|
|
#include "lldb/Target//DynamicRegisterInfo.h"
|
|
#include "lldb/Target/Thread.h"
|
|
|
|
namespace lldb_private {
|
|
class ScriptedProcess;
|
|
}
|
|
|
|
namespace lldb_private {
|
|
|
|
class ScriptedThread : public lldb_private::Thread {
|
|
|
|
public:
|
|
ScriptedThread(ScriptedProcess &process,
|
|
lldb::ScriptedThreadInterfaceSP interface_sp, lldb::tid_t tid,
|
|
StructuredData::GenericSP script_object_sp = nullptr);
|
|
|
|
~ScriptedThread() override;
|
|
|
|
static llvm::Expected<std::shared_ptr<ScriptedThread>>
|
|
Create(ScriptedProcess &process,
|
|
StructuredData::Generic *script_object = nullptr);
|
|
|
|
lldb::RegisterContextSP GetRegisterContext() override;
|
|
|
|
lldb::RegisterContextSP
|
|
CreateRegisterContextForFrame(lldb_private::StackFrame *frame) override;
|
|
|
|
bool LoadArtificialStackFrames();
|
|
|
|
bool CalculateStopInfo() override;
|
|
|
|
const char *GetInfo() override { return nullptr; }
|
|
|
|
const char *GetName() override;
|
|
|
|
const char *GetQueueName() override;
|
|
|
|
void WillResume(lldb::StateType resume_state) override;
|
|
|
|
void RefreshStateAfterStop() override;
|
|
|
|
void ClearStackFrames() override;
|
|
|
|
StructuredData::ObjectSP FetchThreadExtendedInfo() override;
|
|
|
|
private:
|
|
void CheckInterpreterAndScriptObject() const;
|
|
lldb::ScriptedThreadInterfaceSP GetInterface() const;
|
|
|
|
ScriptedThread(const ScriptedThread &) = delete;
|
|
const ScriptedThread &operator=(const ScriptedThread &) = delete;
|
|
|
|
std::shared_ptr<DynamicRegisterInfo> GetDynamicRegisterInfo();
|
|
|
|
const ScriptedProcess &m_scripted_process;
|
|
lldb::ScriptedThreadInterfaceSP m_scripted_thread_interface_sp = nullptr;
|
|
lldb_private::StructuredData::GenericSP m_script_object_sp = nullptr;
|
|
std::shared_ptr<DynamicRegisterInfo> m_register_info_sp = nullptr;
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_SOURCE_PLUGINS_SCRIPTED_THREAD_H
|