У меня была эта проблема, пока я сейчас, но всегда, кажется, откладываю задание на этот вопрос, потому что кажется, что я делаю что-то неправильно... но сейчас я чувствую себя иначе... взял этот код:
#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, спасибо всем...