Сохранение указателя стека вызывает ошибку сегментации при перенаправлении вывода - PullRequest
1 голос
/ 06 декабря 2010

Я пишу компилятор Sparc. Один из моих тестовых примеров работает нормально, но вылетает, когда вывод перенаправляется в файл.

Используя GDB, я обнаружил, что это строка, которая вызывает segfault:

save  %sp, -800, %sp

Нет ли у меня места в стеке? В чем дело? Почему это происходит только тогда, когда я перенаправляю вывод?

1 Ответ

0 голосов
/ 15 декабря 2010
Команда

A save в SPARC может вызвать сбой сегмента только через ловушки разлива окна. Это произойдет, если:

  1. вы исчерпали стек (и / или имеете поврежденный указатель стека)
  2. и вызывают разлив окна (то есть обратная запись в регистр сбрасывается в стек).

Последнее означает, что в происшествии есть элемент непредсказуемости. Это связано с тем, что возникновение разливов зависит от предыдущего использования окна регистра - точное возникновение разливов может измениться в зависимости от того, что делали другие процессы, которые совместно используют тот же процессор. Solaris не будет автоматически разливать все окна reg, установленные при каждом переключении контекста, потому что это снизит производительность. Например. две рабочие нагрузки, каждая из которых использует восемь окон (стековых фреймов), могут успешно вытеснять друг друга и работать полностью «без стеков» на процессоре с> = 16 обычными окнами.
Я могу себе представить, что вероятность разлива может увеличиться из-за перенаправления вывода (более глубокие стеки на записи в файл, чем на стороне записи на консоль, с большей вероятностью будут вытеснять reg из вашего процесса).

Если это так, то вы должны быть в состоянии принудительно вызвать сбой вашего тестового сценария даже без перенаправления вывода, если вы связываете фоновый процессор / стог hogger (рекурсивный факториал 200000, в цикле, чтобы навсегда уничтожить окна reg ) на тот же процессор, где обрабатывается ваш тестовый набор.

...