Печать символов в стеке с использованием 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 0x5555555545fa 
0x7fffffffe160: 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

Другие вопросы по тегам