From 482c0dc3c8ad941fa1f64fa39d8e3c7cd2549536 Mon Sep 17 00:00:00 2001 From: jiangchao_j Date: Thu, 24 Jul 2025 19:33:22 +0800 Subject: [PATCH] add callback function registration in libascend_dump.so --- .../msprobe/ccsrc/third_party/ACL/AclApi.cpp | 60 +++++++++++++------ 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/debug/accuracy_tools/msprobe/ccsrc/third_party/ACL/AclApi.cpp b/debug/accuracy_tools/msprobe/ccsrc/third_party/ACL/AclApi.cpp index c79f2820a..49b234347 100644 --- a/debug/accuracy_tools/msprobe/ccsrc/third_party/ACL/AclApi.cpp +++ b/debug/accuracy_tools/msprobe/ccsrc/third_party/ACL/AclApi.cpp @@ -28,6 +28,7 @@ using namespace MindStudioDebugger; constexpr const char* LIB_ASCEND_CL_NAME = "libascendcl.so"; constexpr const char* LIB_MS_ASCEND_NAME = "libmindspore_ascend.so.2"; +constexpr const char* LIB_ASCEND_DUMP_NAME = "libascend_dump.so"; using AclInitFuncType = aclError (*)(const char *); using AclmdlInitDumpFuncType = aclError (*)(); @@ -41,8 +42,17 @@ static AclmdlInitDumpFuncType g_aclmdlInitDumpFunc = nullptr; static AclmdlSetDumpFuncType g_aclmdlSetDumpFunc = nullptr; static AclmdlFinalizeDumpFuncType g_aclmdlFinalizeDumpFunc = nullptr; static AcldumpRegCallbackFuncType g_acldumpRegCallbackFunc = nullptr; +static AcldumpRegCallbackFuncType g_acldumpRegCallbackFuncInSo = nullptr; static AclrtSynchronizeDeviceFuncType g_aclrtSynchronizeDeviceFunc = nullptr; +static const std::map functionMap = { + {"aclInit", reinterpret_cast(&g_aclInitFunc)}, + {"aclmdlInitDump", reinterpret_cast(&g_aclmdlInitDumpFunc)}, + {"aclmdlSetDump", reinterpret_cast(&g_aclmdlSetDumpFunc)}, + {"aclmdlFinalizeDump", reinterpret_cast(&g_aclmdlFinalizeDumpFunc)}, + {"aclrtSynchronizeDevice", reinterpret_cast(&g_aclrtSynchronizeDeviceFunc)}, +}; + DebuggerErrno LoadAclApi() { static void* hLibAscendcl = nullptr; @@ -59,18 +69,8 @@ DebuggerErrno LoadAclApi() return DebuggerErrno::ERROR_DEPENDENCY_NOT_FIND; } - static const std::map functionMap = { - {"aclInit", reinterpret_cast(&g_aclInitFunc)}, - {"aclmdlInitDump", reinterpret_cast(&g_aclmdlInitDumpFunc)}, - {"aclmdlSetDump", reinterpret_cast(&g_aclmdlSetDumpFunc)}, - {"aclmdlFinalizeDump", reinterpret_cast(&g_aclmdlFinalizeDumpFunc)}, - {"aclrtSynchronizeDevice", reinterpret_cast(&g_aclrtSynchronizeDeviceFunc)}, - }; - for (auto& iter : functionMap) { - if (*(iter.second) != nullptr) { - continue; - } + if (*(iter.second) != nullptr) { continue; } *(iter.second) = dlsym(hLibAscendcl, iter.first); if (*(iter.second) == nullptr) { LOG_ERROR(DebuggerErrno::ERROR_DEPENDENCY_NOT_FIND, "Failed to load function " + @@ -92,13 +92,24 @@ DebuggerErrno LoadAclApi() g_acldumpRegCallbackFunc = reinterpret_cast(dlsym(handler, "acldumpRegCallback")); if (g_acldumpRegCallbackFunc == nullptr) { - LOG_ERROR(DebuggerErrno::ERROR_DEPENDENCY_NOT_FIND, "Failed to load function acldumpRegCallback from " + - libName + "."); + LOG_WARNING(DebuggerErrno::ERROR_DEPENDENCY_NOT_FIND, "Failed to load function acldumpRegCallback from " + + libName + "."); } - LOG_DEBUG("Load function acldumpRegCallback from " + libName); - - if (handler != hLibAscendcl) { - dlclose(handler); + LOG_DEBUG("Load function acldumpRegCallback from " + libName + "."); + + if (handler != hLibAscendcl) { dlclose(handler); } + + void* dumpHandler = dlopen(LIB_ASCEND_DUMP_NAME, RTLD_LAZY | RTLD_NOLOAD); + if (dumpHandler == nullptr) { + LOG_WARNING(DebuggerErrno::ERROR_DEPENDENCY_NOT_FIND, "Failed to load libascend_dump.so."); + } else { + g_acldumpRegCallbackFuncInSo = reinterpret_cast(dlsym(dumpHandler, "acldumpRegCallback")); + if (g_acldumpRegCallbackFuncInSo == nullptr) { + LOG_WARNING(DebuggerErrno::ERROR_DEPENDENCY_NOT_FIND, + "Failed to load function acldumpRegCallback from libascend_dump.so."); + } + LOG_DEBUG("Load function acldumpRegCallback from libascend_dump.so."); + dlclose(dumpHandler); } return DebuggerErrno::OK; @@ -138,10 +149,21 @@ aclError AclApiAclmdlFinalizeDump() aclError AclApiAcldumpRegCallback(AclDumpCallbackFuncType messageCallback, int32_t flag) { - if (g_acldumpRegCallbackFunc == nullptr) { + if (g_acldumpRegCallbackFunc == nullptr && g_acldumpRegCallbackFuncInSo == nullptr) { throw std::runtime_error("API acldumpRegCallback does not have a definition."); } - return g_acldumpRegCallbackFunc(messageCallback, flag); + aclError staticAclRet = -1; + aclError dynamicAclRet = -1; + if (g_acldumpRegCallbackFunc != nullptr) { + staticAclRet = g_acldumpRegCallbackFunc(messageCallback, flag); + } + if (g_acldumpRegCallbackFuncInSo != nullptr) { + dynamicAclRet = g_acldumpRegCallbackFuncInSo(messageCallback, flag); + } + if (staticAclRet != ACL_SUCCESS && dynamicAclRet != ACL_SUCCESS) { + return dynamicAclRet; + } + return ACL_SUCCESS; } aclError AclApiAclrtSynchronizeDevice() -- Gitee