Подтвердить что ты не робот

Отладка с помощью gdb в программе без оптимизации, но в текущем контексте для локальных переменных нет символа

У меня была эта проблема, пока я сейчас, но всегда, кажется, откладываю задание на этот вопрос, потому что кажется, что я делаю что-то неправильно... но сейчас я чувствую себя иначе... взял этот код:

#include <string>
#include <iostream>
#include <algorithm>
int main(int argc, char** argv)
{
  if(argc < 2)
  {
    std::cout << "usage: " << argv[0] << " <string>" << std::endl;
    return 1;
  }
  std::string str = argv[1];
  std::reverse(str.begin(), str.end());
  std::cout << str << std::endl;
  return 0;
}

Скомпилирован с помощью команды:

g++ -std=c++11 -Wall main.cpp -o main -O0 -ggdb3

Я использую очень недавнюю версию trunk gcc, я соединил ствол 23 сентября и... Также обратите внимание, что я не компилирую с оптимизацией!

Теперь, в любом случае, я начинаю отладку, например:

gdb --quiet --args ./main string

Я установил точку прерывания в строке 12 (обратный алгоритм)

b 12

тогда я запускаю программу

run

тогда я пытаюсь распечатать строку, чтобы увидеть, что это такое

print str

И это, мои дорогие друзья, мне кажется странным: Вывод этой предыдущей команды:

No symbol "str" in current context.

быстрая проверка на локальные переменные не показывает строку либо

info locals

все, что я получаю, это

std::__ioinit = {static _S_refcount = 2, static _S_synced_with_stdio = true}

так что мне интересно, я виноват, или это компилятор или отладчик по вине... это была довольно боль в проблеме оспа, для меня долгое время... так что спасибо за то, вопрос...:)

EDIT: теперь, когда стало ясно, что с моей сборкой gcc что-то не так, мне интересно, встретил ли кто-нибудь отчет об ошибке или какой-либо другой случай, где, похоже, проблема такая же. Я также попробую проверить с недавней сборкой gdb, чтобы убедиться, что с моим текущим отладчиком (который поставляется с ubuntu) определенно не проблема... это имеет смысл?

EDIT2: Итак, после компиляции gdb v7.5, я получил относительно тот же результат, за исключением того, что вообще не было локальных жителей... Я думаю, это означает, что это проблема gcc, спасибо всем...

4b9b3361

Ответ 1

Нет, даже если -quiet это работает для меня. Возможно, что-то не так с вашей настройкой.

~/tmp $ g++ -Wall tmp.cpp -o tmp -O0 -ggdb3
~/tmp $ gdb --quiet --args ./tmp string
Reading symbols from /xxxxxxxx/tmp...done.
(gdb) b 12
Breakpoint 1 at 0x400c95: file tmp.cpp, line 12.
(gdb) run
Starting program: /xxxxxxxx/tmp string
Breakpoint 1, main (argc=2, argv=0x7fffffffdc58) at tmp.cpp:12
12        std::reverse(str.begin(), str.end());
(gdb) print str
$1 = "string"
(gdb) info locals
str = "string"
(gdb)

Ответ 2

Как отмечено в примечаниях к выпуску для GCC 4.8 (т.е. текущей магистрали):

DWARF4 теперь используется по умолчанию при генерации информации об отладке DWARF. Когда -g используется на платформе, использующей DWARF-отладочную информацию, GCC теперь будет по умолчанию -gdwarf-4 -fno-debug-types-section. GDB 7.5, Valgrind 3.8.0 и elfutils 0.154 пользователи отладочной информации поддерживают DWARF4 по умолчанию. Перед GCC 4.8 используемой по умолчанию версией был DWARF2. Чтобы GCC 4.8 сгенерировал более старую версию DWARF, используйте -g вместе с -gdwarf-2 или -gdwarf-3. По умолчанию для Darwin и VxWorks все еще находится -gdwarf-2 -gstrict-dwarf.

Итак, вам нужно использовать GDB 7.5 или скомпилировать с -g -gdwarf-2