【问题标题】:GDB Breakpoints are inaccurrate on MacGDB 断点在 Mac 上不准确
【发布时间】:2018-10-11 21:38:24
【问题描述】:

我最近一直在 Mac 上使用 gdb,但有时断点是错误的,因此如果我分配断点并运行 gdb 有时会跳过断点或在错误的行上中断。谁能帮我吗?我试图找到以下问题的最简单情况。:

Project
|
+-- CMakeLists.txt
|    
+-- include
|    |  
|    +-- A.hpp
|
+-- src 
     |  
     +-- main.cpp

A.hpp

#pragma once

class A { 
public: 
   A(const char* t){};
}; 

main.cpp

1 #include<string>
2 #include"A.hpp"
3 int main(){ 
4   std::string s = "";
5   A a = "";
6   return 0;
7 }

CMakeLists.txt

1 cmake_minimum_required (VERSION 3.0)
2
3
4 file(GLOB SOURCES "src/*.cpp")
5 set(CMAKE_BUILD_TYPE Debug)
6 
7 add_executable(main ${SOURCES})
8
9 target_include_directories(main PUBLIC include)

如果我尝试在分配字符串的 main.cpp 第 4 行设置断点并在 gdb 中运行 main,它会在第 5 行停止。 我认为当使用标准标题时会发生这种情况。如果我将第 4 行更改为像 int i = 0; 这样的简单赋值,断点会按预期在第 4 行停止。

我有:

Mac 版 High Sierra 10.13.6

CMakeVersion:3.12.0

GDB 版本:8.0.1(通过自制软件安装)

提前感谢您的帮助。

【问题讨论】:

  • 将尝试重现,但没有 Mac。你用的是什么版本的clang?
  • @Mark Plotnick:Apple LLVM 版本 10.0.0 (clang-1000.10.44.2) 目标:x86_64-apple-darwin17.7.0 线程模型:posix

标签: c++ macos debugging gdb macos-high-sierra


【解决方案1】:

gdb 有时会跳过断点或在错误的行中断

一般来说,当代码经过优化构建时会发生这种情况。

我知道您选择了CMAKE_BUILD_TYPE Debug,但也许出于某种原因仍在进行优化构建?

【讨论】:

  • 感谢您的回答。我从没想过即使构建类型是调试也会有优化。我认为这可能是因为未使用分配的字符串,但我在上面编辑了我的帖子以显示 gdb 在其他未使用的分配变量上停止。这个问题是否特定于某些标准标头类型,例如字符串?否则,有什么方法可以完全删除所有这些优化,使其在字符串分配时停止?
  • @O.Oyibo 您的第一步应该是确认或反驳我的猜测。 make clean &amp;&amp; makeobserve 用于编译 main.cpp 的命令。它有-O2 或类似的优化标志,还是没有?
  • 我运行 make clean && make VERBOSE=1 来查看编译命令,但没有看到优化标志。我只看到 -g 标志。在发布最初的问题之前我已经尝试过这个,所以我想知道即使没有任何优化标志,它是否仍然进行一些优化?从你所说的看来确实如此,但我不知道为什么。
  • @O.Oyibo 没有优化标志,应该没有优化,所以我的猜测可能是错误的。
  • 如果你不介意我问你有同样的问题吗?我只是想检查一下我的配置/gdb 设置是否有问题。
猜你喜欢
  • 2015-11-06
  • 2013-07-20
  • 2012-03-11
  • 2021-11-06
  • 1970-01-01
  • 2012-02-19
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多