указатель «this» изменяется в обратном следе GDB - PullRequest
4 голосов
/ 01 апреля 2010

Я изучаю дамп ядра и заметил, что в одном кадре указатель 'this' отличается от следующего кадра (в том же потоке). Не только немного по-другому, но и с 0x8167428 до 0x200.

Я не очень хорошо разбираюсь в использовании GDB, но мне это не кажется правильным. Это проблематично, и если да, то что может быть причиной?

Ответы [ 3 ]

3 голосов
/ 01 апреля 2010

Указатель this может меняться между кадрами в трассировке GDB, если функция в следующем кадре вызывается для другого объекта (даже если объекты одного типа), поскольку это для конкретного экземпляра. Это вероятно не ваша проблема.

0x200 не является допустимым значением для this и почти наверняка указывает на повреждение памяти какого-либо типа. Указатель this иногда сохраняется в стеке и передается как невидимый первый аргумент функции. Поэтому, если вы повредили стек (выйдя за пределы записи в другую переменную), вы можете увидеть поврежденный указатель this.

Само значение 0x200 интересно. Поскольку он настолько близок к 0, но на самом деле не 0, это указывает на то, что рассматриваемый вами экземпляр, вероятно, является частью другого объекта или массива, расположенного 0x200 байт от начала этого объекта / массива, и что адрес объекта / массива на самом деле NULL. Глядя на свой код, вы сможете довольно легко определить, какой объект получил значение NULL, что приводит к сообщению 0x200.

1 голос
/ 01 апреля 2010

Возможно, что оптимизация в коде сбивает с толку отладчик. Это распространенная проблема при отладке розничного кода. Попробуйте отключить оптимизацию, перезапустить сценарий и посмотреть, не возникает ли такая же проблема.

0 голосов
/ 01 апреля 2010

this указатель является локальным для фрейма.

Если другой фрейм принадлежит функции 'C', вы можете видеть что-то вроде 0x200

...