如果间接调用函数,则静态库中的断点不起作用

Breakpoint in a static lib doesn't work if the function is called indirectly

提问人:Lorenzo Aldrighetti 提问时间:11/8/2023 更新时间:11/8/2023 访问量:43

问:

我正在开发一个使用 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;
}
C++ cmake qt-creator

评论

0赞 Botje 11/8/2023
你确定你的编译器没有内联这个非常小的函数的定义吗?检查生成的代码。
0赞 Lorenzo Aldrighetti 11/8/2023
在我的实际应用程序中,我调用的函数由 4 个 for 循环和 1 个 while 循环组成,我假设编译器没有内联这种函数。顺便说一句,我不知道如何检查生成的代码。你能告诉我怎么做吗?
0赞 Botje 11/8/2023
objdump -d(Linux) 或 (macOS)。搜索调用代码,查看是否有对函数的调用,或者它是否被巨大的代码 blob 替换。otool -tV
0赞 Lorenzo Aldrighetti 11/8/2023
谢谢!我已经在win上检查了dumpbin,并找到了对该函数的调用。5 行后有?doAnOperation@Core@@QEAAHHH@Z:call @ILT+465(?sum@Utils@MP@@SAHHH@Z)
0赞 Botje 11/8/2023
MP::SDK::sum 与 MP::Utils::Sum 不同,除非您(出于某种原因)更改了它以在此处发布。

答: 暂无答案