mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-11-23 10:09:54 +00:00
Optimized the performance of the printing C++ stack
issues:https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/I9DRRI Signed-off-by: rentangyu <rentangyu@huawei.com>
This commit is contained in:
parent
bce7b3e87d
commit
f1d75e0118
@ -254,10 +254,6 @@ JSHandle<EcmaString> ErrorHelper::BuildEcmaStackTrace(JSThread *thread, std::str
|
||||
if (sourceMapcb != nullptr && !data.empty()) {
|
||||
data = sourceMapcb(data.c_str());
|
||||
}
|
||||
auto nativeStackcb = ecmaVm->GetNativeStackCallback();
|
||||
if (nativeStackcb != nullptr && data.empty()) {
|
||||
data = nativeStackcb();
|
||||
}
|
||||
|
||||
ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
|
||||
return factory->NewFromStdString(data);
|
||||
|
@ -26,6 +26,9 @@
|
||||
#if defined(PANDA_TARGET_OHOS)
|
||||
#include "ecmascript/extractortool/src/extractor.h"
|
||||
#endif
|
||||
#if defined(ENABLE_EXCEPTION_BACKTRACE)
|
||||
#include "ecmascript/platform/backtrace.h"
|
||||
#endif
|
||||
|
||||
namespace panda::ecmascript {
|
||||
std::string JsStackInfo::BuildMethodTrace(Method *method, uint32_t pcOffset, bool enableStackSourceFile)
|
||||
@ -125,6 +128,13 @@ std::string JsStackInfo::BuildJsStackTrace(JSThread *thread, bool needNative)
|
||||
data.append(" at native method (").append(strm.str()).append(")\n");
|
||||
}
|
||||
}
|
||||
if (data.empty()) {
|
||||
#if defined(ENABLE_EXCEPTION_BACKTRACE)
|
||||
std::ostringstream stack;
|
||||
Backtrace(stack);
|
||||
data = stack.str();
|
||||
#endif
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
@ -49,12 +49,6 @@ public:
|
||||
JSThread *thread {nullptr};
|
||||
};
|
||||
|
||||
HWTEST_F_L0(JsStackInfoTest, BuildJsStackTrace)
|
||||
{
|
||||
std::string stack = JsStackInfo::BuildJsStackTrace(thread, false);
|
||||
ASSERT_TRUE(!stack.empty());
|
||||
}
|
||||
|
||||
HWTEST_F_L0(JsStackInfoTest, FrameCheckTest)
|
||||
{
|
||||
uintptr_t frame[22];
|
||||
|
@ -95,7 +95,6 @@ class Jit;
|
||||
using NativePtrGetter = void* (*)(void* info);
|
||||
using SourceMapCallback = std::function<std::string(const std::string& rawStack)>;
|
||||
using SourceMapTranslateCallback = std::function<bool(std::string& url, int& line, int& column)>;
|
||||
using NativeStackCallback = std::function<std::string()>;
|
||||
using ResolveBufferCallback = std::function<bool(std::string dirPath, uint8_t **buff, size_t *buffSize)>;
|
||||
using UnloadNativeModuleCallback = std::function<bool(const std::string &moduleKey)>;
|
||||
using RequestAotCallback =
|
||||
@ -311,16 +310,6 @@ public:
|
||||
return sourceMapTranslateCallback_;
|
||||
}
|
||||
|
||||
void SetNativeStackCallback(NativeStackCallback cb)
|
||||
{
|
||||
nativeStackCallback_ = cb;
|
||||
}
|
||||
|
||||
NativeStackCallback GetNativeStackCallback() const
|
||||
{
|
||||
return nativeStackCallback_;
|
||||
}
|
||||
|
||||
size_t GetNativePointerListSize()
|
||||
{
|
||||
return nativePointerList_.size();
|
||||
@ -694,7 +683,6 @@ private:
|
||||
NativePtrGetter nativePtrGetter_ {nullptr};
|
||||
SourceMapCallback sourceMapCallback_ {nullptr};
|
||||
SourceMapTranslateCallback sourceMapTranslateCallback_ {nullptr};
|
||||
NativeStackCallback nativeStackCallback_ {nullptr};
|
||||
void *loop_ {nullptr};
|
||||
|
||||
// resolve path to get abc's buffer
|
||||
|
@ -96,7 +96,6 @@ using JSTaggedType = uint64_t;
|
||||
using ConcurrentCallback = void (*)(Local<JSValueRef> result, bool success, void *taskInfo, void *data);
|
||||
using SourceMapCallback = std::function<std::string(const std::string& rawStack)>;
|
||||
using SourceMapTranslateCallback = std::function<bool(std::string& url, int& line, int& column)>;
|
||||
using NativeStackCallback = std::function<std::string()>;
|
||||
using DeviceDisconnectCallback = std::function<bool()>;
|
||||
|
||||
#define ECMA_DISALLOW_COPY(className) \
|
||||
@ -1327,7 +1326,6 @@ public:
|
||||
static void SetNativePtrGetter(EcmaVM *vm, void* cb);
|
||||
static void SetSourceMapCallback(EcmaVM *vm, SourceMapCallback cb);
|
||||
static void SetSourceMapTranslateCallback(EcmaVM *vm, SourceMapTranslateCallback cb);
|
||||
static void SetNativeStackCallback(EcmaVM *vm, NativeStackCallback cb);
|
||||
static void SetHostEnqueueJob(const EcmaVM* vm, Local<JSValueRef> cb);
|
||||
static EcmaVM* CreateEcmaVM(const ecmascript::JSRuntimeOptions &options);
|
||||
static void PreFork(EcmaVM *vm);
|
||||
|
@ -2991,11 +2991,6 @@ void JSNApi::SetSourceMapTranslateCallback(EcmaVM *vm, SourceMapTranslateCallbac
|
||||
vm->SetSourceMapTranslateCallback(callback);
|
||||
}
|
||||
|
||||
void JSNApi::SetNativeStackCallback(EcmaVM *vm, NativeStackCallback callback)
|
||||
{
|
||||
vm->SetNativeStackCallback(callback);
|
||||
}
|
||||
|
||||
void JSNApi::SetSourceMapCallback(EcmaVM *vm, SourceMapCallback callback)
|
||||
{
|
||||
vm->SetSourceMapCallback(callback);
|
||||
|
@ -20,6 +20,6 @@
|
||||
#include <string>
|
||||
|
||||
namespace panda::ecmascript {
|
||||
void Backtrace(std::ostringstream &stack, bool enableCache = false, bool jsStack = false);
|
||||
void Backtrace(std::ostringstream &stack, bool enableCache = false);
|
||||
} // namespace panda::ecmascript
|
||||
#endif // ECMASCRIPT_PLATFORM_BACKTRACE_H
|
||||
|
@ -24,8 +24,7 @@ namespace panda::ecmascript {
|
||||
static const int MAX_STACK_SIZE = 256;
|
||||
static const int FRAMES_LEN = 16;
|
||||
|
||||
void Backtrace(std::ostringstream &stack, [[maybe_unused]] bool enableCache,
|
||||
[[maybe_unused]] bool jsStack)
|
||||
void Backtrace(std::ostringstream &stack, [[maybe_unused]] bool enableCache)
|
||||
{
|
||||
void *buffer[MAX_STACK_SIZE];
|
||||
char **stackList = nullptr;
|
||||
|
@ -17,8 +17,7 @@
|
||||
#include "ecmascript/log_wrapper.h"
|
||||
|
||||
namespace panda::ecmascript {
|
||||
void Backtrace([[maybe_unused]] std::ostringstream &stack, [[maybe_unused]] bool enableCache,
|
||||
[[maybe_unused]] bool jsStack)
|
||||
void Backtrace([[maybe_unused]] std::ostringstream &stack, [[maybe_unused]] bool enableCache)
|
||||
{
|
||||
LOG_ECMA(INFO) << "Print backtrace in macos not support";
|
||||
}
|
||||
|
@ -29,8 +29,6 @@
|
||||
namespace panda::ecmascript {
|
||||
static const std::string LIB_UNWIND_SO_NAME = "libunwind.so";
|
||||
static const std::string LIB_UNWIND_Z_SO_NAME = "libunwind.z.so";
|
||||
static const std::string LIB_ARK_JSRUNTIME_SO_NAME = "libark_jsruntime.so";
|
||||
static const std::string LIB_ACE_NAPI_Z_SO_NAME = "libace_napi.z.so";
|
||||
static const int MAX_STACK_SIZE = 16;
|
||||
static const int LOG_BUF_LEN = 1024;
|
||||
|
||||
@ -38,7 +36,7 @@ using UnwBackTraceFunc = int (*)(void**, int);
|
||||
|
||||
static std::map<void *, Dl_info> stackInfoCache;
|
||||
|
||||
void Backtrace(std::ostringstream &stack, bool enableCache, bool jsStack)
|
||||
void Backtrace(std::ostringstream &stack, bool enableCache)
|
||||
{
|
||||
static UnwBackTraceFunc unwBackTrace = nullptr;
|
||||
if (!unwBackTrace) {
|
||||
@ -60,10 +58,7 @@ void Backtrace(std::ostringstream &stack, bool enableCache, bool jsStack)
|
||||
void *buffer[MAX_STACK_SIZE] = { nullptr };
|
||||
int level = unwBackTrace(reinterpret_cast<void**>(&buffer), MAX_STACK_SIZE);
|
||||
stack << "=====================Backtrace========================";
|
||||
bool flag = true;
|
||||
int index = 0;
|
||||
for (int i = 1; i < level; i++) {
|
||||
index++;
|
||||
Dl_info info;
|
||||
auto iter = stackInfoCache.find(buffer[i]);
|
||||
if (enableCache && iter != stackInfoCache.end()) {
|
||||
@ -77,26 +72,12 @@ void Backtrace(std::ostringstream &stack, bool enableCache, bool jsStack)
|
||||
}
|
||||
}
|
||||
const char *file = info.dli_fname ? info.dli_fname : "";
|
||||
if (jsStack) {
|
||||
std::string str = file;
|
||||
auto splitPos = str.rfind("/");
|
||||
if (splitPos != std::string::npos) {
|
||||
str = str.substr(splitPos + 1);
|
||||
}
|
||||
if ((str.compare(LIB_ARK_JSRUNTIME_SO_NAME) == 0 ||
|
||||
str.compare(LIB_ACE_NAPI_Z_SO_NAME) == 0) && flag) {
|
||||
index--;
|
||||
continue;
|
||||
} else {
|
||||
flag = false;
|
||||
}
|
||||
}
|
||||
uint64_t offset = info.dli_fbase ? ToUintPtr(buffer[i]) - ToUintPtr(info.dli_fbase) : 0;
|
||||
char buf[LOG_BUF_LEN] = {0};
|
||||
char frameFormatWithMapName[] = "#%02zu pc %016" PRIx64 " %s";
|
||||
int ret = 0;
|
||||
ret = static_cast<int>(snprintf_s(buf, sizeof(buf), sizeof(buf) - 1, frameFormatWithMapName, \
|
||||
index, offset, file));
|
||||
i, offset, file));
|
||||
if (ret <= 0) {
|
||||
LOG_ECMA(ERROR) << "Backtrace snprintf_s failed";
|
||||
return;
|
||||
|
@ -17,8 +17,7 @@
|
||||
#include "ecmascript/log_wrapper.h"
|
||||
|
||||
namespace panda::ecmascript {
|
||||
void Backtrace([[maybe_unused]] std::ostringstream &stack, [[maybe_unused]] bool enableCache,
|
||||
[[maybe_unused]] bool jsStack)
|
||||
void Backtrace([[maybe_unused]] std::ostringstream &stack, [[maybe_unused]] bool enableCache)
|
||||
{
|
||||
LOG_ECMA(INFO) << "Print backtrace in windows not support";
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user