Печать символов в стеке с использованием GDB
Я пытался отладить программу с поврежденным стеком, которая кажется слишком большой (имеет несколько потоков) для ручной отладки. Поэтому мне было интересно, есть ли способ распечатать символы, которые соответствуют адресам в стеке после повреждения, чтобы попытаться получить лучшее представление о том, как оно туда попало.
Я заметил, что команда "info symbol" (которая обычно печатает символ по заданному адресу) принимает только один адрес за раз. Итак, я попытался написать сценарий, чтобы делать то, что хотел, но когда я попытался сохранить адреса в вспомогательных переменных, чтобы я мог перебирать стек вручную, команда info symbol не работала.
Я знаю на WinDBG есть dds
команда, которая делает то, что я ищу, но я не смог найти эквивалент в GDB. Кто-нибудь знает эквивалент?
1 ответ
x команда сa
flag расшифрует память как адрес и попытается найти символы
данный код:
int func3(int a)
{
return a+a;
}
int func2(int b)
{
return func3(b+b);
}
int func1(int c)
{
return func2(c+c);
}
int main(int argc, char** argv)
{
return func1(argc);
}
и точка останова на выходе func3 будет:
(gdb) x /16ga $rsp 0x7fffffffe150: 0x7fffffffe168 0x5555555545fa0x7fffffffe160: 0x2000000c2 0x7fffffffe180 0x7fffffffe170: 0x555555554613 0x100000000 0x7fffffffe180: 0x7fffffffe1a0 0x55555555462e <основной + 25> 0x7fffffffe190: 0x7fffffffe288 0x100000000 0x7fffffffe1a0: 0x555555554630 <__libc_csu_init> 0x7ffff7a05b97 <__ libc_start_main +231> 0x7fffffffe1b0: 0x1 0x7fffffffe288 0x7fffffffe1c0: 0x100008000 0x555555554615
Это может не ответить на ваш вопрос, но может помочь вам определить место, где у вас поврежден стек. Вы пробовали компилировать с включенными флагами -fstack-protectorxxx?
https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques/Stack_corruption