LINUX.ORG.RU

История изменений

Исправление Stanson, (текущая версия) :

обращаю внимание тут string, а не с-строки

Это у тебя в сырце string. А в бинаре запросто могут остаться только c-строки, в зависимости от того, что там компилятор наоптимизирует в итоге. У тебя string твои глобальные, и используются только в cout только для чтения содержимого. Никаких изменений инициализированных константой string у тебя нет, так что их в константы можно соптимизировать. И в итоге можно выкинуть всё std::string барахло при оптимизации потому что оно вообще никак не используется в коде. И откуда gdb возьмёт тебе твой string если его в бинаре не будет вообще?

В реале, для бинарника без сырцов обычно делаешь так (если на 100% уверен, что там именно std::string а не c-строки) - ищешь нужную с-строку, смотришь куда она копируется (или её адрес куда сохраняется), дальше пытаешься около этого адреса в данных найти структуру похожую на string, в начале у тебя всякий vtbl должен быть (см как C++ классы в памяти хранятся). Ну и используешь адрес где vtbl как начало твоего string для watch.

Но, как я уже написал - в твоём примере string вообще может не быть, если скомпилено с оптимизацией.

Исправление Stanson, :

обращаю внимание тут string, а не с-строки

Это у тебя в сырце string. А в бинаре запросто могут остаться только c-строки, в зависимости от того, что там компилятор наоптимизирует в итоге. У тебя string твои глобальные, и используются только в cout только для чтения содержимого. Никаких изменений инициализированных константой string у тебя нет, так что их в константы можно соптимизировать. И в итоге можно выкинуть всё std::string барахло при оптимизации потому что оно вообще никак не используется в коде. И откуда gdb возьмёт тебе твой string если его в бинаре не будет вообще?

В реале, для бинарника без сырцов обычно делаешь так - ищешь нужную строку, смотришь куда она копируется (или её адрес куда сохраняется), дальше пытаешься около этого адреса в данных найти структуру похожую на string, в начале у тебя всякий vtbl должен быть (см как C++ классы в памяти хранятся). Ну и используешь адрес где vtbl как начало твоего string для watch.

Но, как я уже написал - в твоём примере string вообще может не быть, если скомпилено с оптимизацией.

Исходная версия Stanson, :

обращаю внимание тут string, а не с-строки

Это у тебя в сырце string. А в бинаре запросто могут остаться только c-строки, в зависимости от того, что там компилятор наоптимизирует в итоге. У тебя string твои глобальные, и используются только в cout только для чтения содержимого. Никаких изменений инициализированных константой string у тебя нет, так что их в константы можно соптимизировать. И в итоге можно выкинуть всё std::string барахло при оптимизации потому что оно вообще никак не используется в коде. И откуда gdb возьмёт тебе твой string если его в бинаре не будет вообще?