gdb 单步执行直到退出函数

gdb single stepping until exit from function

我正在从事一个具有以下架构的项目。

sync
  |--- CMakeLists.txt
  |--- SyncManager
           |---  CMakeLists.txt
           |---  src
  |--- SyncCommon
           |---  CMakeLists.txt
           |---  src
  |--- SyncProcessor
           |---  CMakeLists.txt
           |---  src

SyncManager 和SyncProcessor 都使用SyncCommon 中的函数。 CMakeLists.txt内容如下

sync/CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(sync)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

add_subdirectory(SyncManager)
add_subdirectory(SyncProcessor) 
add_subdirectory(SyncCommon)

sync/SyncManager/CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(SyncManager VERSION 2.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0")

file(GLOB project_SRCS src/*.cpp src/*.h)

include_directories(src/ ../SyncCommon/src)

add_executable(syncManager ${project_SRCS})
target_link_libraries(syncManager syncCommon)

sync/SyncCommon/CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(ingester VERSION 2.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS " -g -Wall -O2 -w -fpermissive -pthread")

file(GLOB project_SRCS src/*.cpp src/*.h mhmc/*.c mhmc/*.h)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/src/cmake/")
find_package(MYSQL REQUIRED)
find_package(CURL REQUIRED)

add_library(syncCommon STATIC ${project_SRCS})
target_include_directories(syncCommon 
                           PUBLIC
                           ${CMAKE_CURRENT_SOURCE_DIR}/src
                           ${CURL_INCLUDE_DIRS}
                           ${MYSQL_INCLUDE_DIRS}
                   
)
target_link_libraries(syncCommon ${CURL_LIBRARIES} ${MYSQL_LIBRARY})

sync/SyncProcessor/CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(SyncProcessor VERSION 2.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS " -std=c++11 -Wall -O2 -w -g -O0 -fpermissive -pthread")
set(CMAKE_CXX_STANDARD_REQUIRED True)

file(GLOB project_SRCS src/*.cpp src/*.h)
find_package(CURL REQUIRED)

include_directories(src/ ../SyncCommon/src)

add_executable(syncProcessor ${project_SRCS})
target_include_directories(syncProcessor 
                           PUBLIC
                           ${CMAKE_CURRENT_SOURCE_DIR}/src
                           ${CURL_INCLUDE_DIRS}
)
target_link_libraries(syncProcessor syncCommon ${CURL_LIBRARIES})

现在我正在尝试调试 SyncManager。 SyncCommon 中的函数可以逐步执行。但是当涉及到 SyncManager 中的函数时,我得到了这个错误“单步执行直到退出函数”。我已经将 gdb 更新到最新版本,但仍然无法正常工作。

您的 sync/SyncCommon/CMakeLists.txt 有这个:

set(CMAKE_CXX_FLAGS " -g -Wall -O2 -w -fpermissive -pthread")

您的 sync/SyncManager/CMakeLists.txt 有这个:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0")
file(GLOB project_SRCS src/*.cpp src/*.h)

尽管有 C++ 个来源,但您正在使用 C 个标记。您应该同时设置 CMAKE_C_FLAGS CMAKE_CXX_FLAGS,或者如果您没有任何普通的 C 来源,则只设置后者。

P.S。您还应该摆脱 -fpermissive-w——而不是修复您的来源,这样 -fpermissive 就不是必需的,并打开 -Wall——抑制编译器会适得其反警告——您只会花费更长的时间来调试编译器会告诉您的问题。