提问人:Lorenzo Aldrighetti 提问时间:11/8/2023 更新时间:11/8/2023 访问量:43
如果间接调用函数,则静态库中的断点不起作用
Breakpoint in a static lib doesn't work if the function is called indirectly
问:
我正在开发一个使用 Qt5、CMake 进行构建和 QtCreator 作为 IDE 的应用程序。
该项目由一个 SDK 静态库、一个使用 SDK 库函数的核心共享库,以及两个直接使用 SDK 库的核心库函数和部分函数的 gui 应用程序组成。
如果我在 SDK 库函数中使用断点调试 gui 应用程序:
- 如果函数由核心库调用,则调试器不会中断
- 如果 GUI 应用程序直接调用该函数,则调试器会中断该函数。
为什么?我认为我在 CMake 配置中犯了错误
我的项目结构如下:
MyProject/
├── SDK/
│ ├── CMakeLists.txt
│ ├── MP/
│ └── Utils.h
├── core/
| ├── CMakeLists.txt
| ├── core_global.h
│ ├── Core.h
│ └── Core.cpp
├── desktop-gui/
| ├── CMakeLists.txt
│ └── main.cpp
├── mobile-gui/
| ├── CMakeLists.txt
│ └── main.cpp
├── CMakeLists.txt
下面是 CMakeLists 文件:
MyProject/CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(MyProject LANGUAGES CXX)
add_subdirectory(SDK)
add_subdirectory(core)
add_subdirectory(desktop-gui)
SDK/CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(sdk LANGUAGES CXX)
find_package(Qt5 REQUIRED COMPONENTS Core)
add_library(${PROJECT_NAME} STATIC
MP/Utils.h
)
target_include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/MP")
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core)
core/CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(core LANGUAGES CXX)
find_package(Qt5 REQUIRED COMPONENTS Core)
add_library(core SHARED
core_global.h
Core.cpp
Core.h
)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(${PROJECT_NAME}
PRIVATE
Qt5::Core
PUBLIC
sdk
)
target_compile_definitions(${PROJECT_NAME} PUBLIC CORE_LIBRARY)
desktop-gui/CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(desktop-gui LANGUAGES CXX)
find_package(Qt5 REQUIRED COMPONENTS Core)
add_executable(${PROJECT_NAME}
main.cpp
)
target_link_libraries(Application
Qt5::Core
sdk
core
)
举个简短的例子。我的SDK库有一个功能
namespace MP {
class Utils
{
public:
static int sum(int a, int b) { return a + b; }
};
}
我的核心库有一个函数
class Core
{
public:
int doAnOperation(int a, int b)
{
return MP::Utils::sum(a, b);
}
};
我的 gui 应用程序
int main(int argc, char *argv[])
{
Core core;
std::cout << core.doAnOperation(2, 2); // Don't stop on breakpoint
std::cout << MP::Utils::sum(2, 2); // Stops on breakpoint
return 1;
}
答: 暂无答案
评论
objdump -d
(Linux) 或 (macOS)。搜索调用代码,查看是否有对函数的调用,或者它是否被巨大的代码 blob 替换。otool -tV
?doAnOperation@Core@@QEAAHHH@Z:
call @ILT+465(?sum@Utils@MP@@SAHHH@Z)