Я недавно использовал gdb на Mac, но иногда точки останова ошибочны, поэтому, если я назначаю точку останова и запускаю 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)
Если я попытаюсь установить точку останова в строке 4 main.cpp, где назначена строка, и запустить main в gdb, она остановится на строке 5. Я думаю, что это происходит, когда используются стандартные заголовки вроде. Если я изменю строку 4 на простое присвоение, например int i = 0;, точка останова остановится на строке 4, как и ожидалось.
У меня есть:
Версия для Mac High Sierra 10.13.6
CMakeVersion: 3.12.0
Версия GDB: 8.0.1 (устанавливается через homebrew)
Спасибо за любую помощь заранее.
@Mark Plotnick: Apple LLVM версии 10.0.0 (clang-1000.10.44.2) Цель: x86_64-apple-darwin17.7.0 Модель потока: posix





gdb sometimes skips the breakpoint or breaks on the wrong line
Обычно это происходит, когда код построен с оптимизацией.
Я знаю, что вы выбрали CMAKE_BUILD_TYPE Debug, но, может быть, он по какой-то причине все еще делает оптимизированную сборку?
Спасибо за ответ. Я никогда не думал, что все равно будут оптимизации, даже если тип сборки - отладка. Я подумал, что это может быть потому, что назначенная строка не используется, но я отредактировал свой пост выше, чтобы показать остановки gdb для других неиспользуемых назначенных переменных. Значит, эта проблема характерна для некоторых стандартных типов заголовков, таких как строки? В противном случае, есть ли способ полностью удалить все эти оптимизации, чтобы они остановились на строковых присвоениях?
@ O.Oyibo Ваш первый шаг должен состоять в том, чтобы подтвердить или опровергнуть мою догадку. make clean && make и наблюдать - команда, которая используется для компиляции main.cpp. Есть ли у него -O2 или аналогичные флаги оптимизации, или нет?
Я запустил make clean && make VERBOSE = 1, чтобы увидеть команды компиляции, но не вижу флагов оптимизации. Я вижу только флаг -g. Я уже пробовал это, прежде чем публиковать первоначальный вопрос, поэтому мне было интересно, если даже без каких-либо флагов оптимизации он все еще выполняет некоторые оптимизации? Из того, что вы говорите. Казалось бы, да, но я понятия не имею, почему.
@ O.Oyibo Без флагов оптимизации не должно быть оптимизаций, поэтому мое предположение, вероятно, неверно.
Если вы не возражаете, я спрошу, у вас такая же проблема? Я просто хочу проверить, не что-то не так с моей конфигурацией / настройкой gdb.
Попробую воспроизвести, но нет Mac. Какую версию clang вы используете?