• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ECMASCRIPT_DFX_STACKINFO_JS_STACKINFO_H
17 #define ECMASCRIPT_DFX_STACKINFO_JS_STACKINFO_H
18 
19 #include <csignal>
20 #include "ecmascript/compiler/aot_file/aot_file_manager.h"
21 #include "ecmascript/js_thread.h"
22 
23 #if defined(PANDA_TARGET_OHOS)
24 constexpr uint16_t URL_MAX = 1024;
25 constexpr uint16_t FUNCTIONNAME_MAX = 1024;
26 #endif
27 
28 namespace panda::ecmascript {
29 struct JsFrameInfo {
30     std::string functionName;
31     std::string fileName;
32     std::string pos;
33     uintptr_t *nativePointer = nullptr;
34 };
35 
36 struct JsFrameParam {
37     std::string PandaFileName;
38     panda_file::File::EntityId methodId;
39     uint32_t byteCodeOffset;
40 };
41 
42 #if defined(PANDA_TARGET_OHOS)
43 struct JsFrame {
44     char functionName[FUNCTIONNAME_MAX];
45     char url[URL_MAX];
46     int32_t line;
47     int32_t column;
48 };
49 #endif
50 
51 class JsStackInfo {
52 public:
53     static std::string BuildInlinedMethodTrace(const JSPandaFile *pf, std::map<uint32_t, uint32_t> &methodOffsets);
54     static std::string BuildJsStackTrace(JSThread *thread, bool needNative);
55     static std::vector<JsFrameInfo> BuildJsStackInfo(JSThread *thread);
56     static std::string BuildMethodTrace(Method *method, uint32_t pcOffset, bool enableStackSourceFile = true);
57     static AOTFileManager *loader;
58 };
59 void CrashCallback(char *buf, size_t len, void *ucontext);
60 } // namespace panda::ecmascript
61 #endif  // ECMASCRIPT_DFX_STACKINFO_JS_STACKINFO_H
62 extern "C" int step_ark_managed_native_frame(
63     int pid, uintptr_t *pc, uintptr_t *fp, uintptr_t *sp, char *buf, size_t buf_sz);
64 extern "C" int get_ark_js_heap_crash_info(
65     int pid, uintptr_t *x20, uintptr_t *fp, int out_js_info, char *buf, size_t buf_sz);
66 #if defined(PANDA_TARGET_OHOS)
67 extern "C" int get_ark_native_frame_info(
68     int pid, uintptr_t *pc, uintptr_t *fp, uintptr_t *sp, panda::ecmascript::JsFrame *jsFrame, size_t &size);
69 #endif
70 // define in dfx_signal_handler.h
71 typedef void(*ThreadInfoCallback)(char *buf, size_t len, void *ucontext);
72 extern "C" void SetThreadInfoCallback(ThreadInfoCallback func) __attribute__((weak));