Как узнать текст выражения, на котором eval() закончился с фатальной ошибкой?
Можете попробовать использовать PECL расширение runkit, если есть возможность его установки на сервер. В частности, runkit предоставляет класс Runkit_Sandbox, предоставляющий возможность запуска кода в изолированных условиях (в отдельно выделенной области памяти). См. метод Runkit_Sandbox::eval() в примерах в документации к классу. Также в runkit есть метод runkit_lint — аналог системного вызова «php -l file», но принимающий в качестве аргумента строку с кодом, а не путь к файлу.
так вы удаляйте файл после eval — так останутся только те, что не прошли eval.
и писать можно не только в файлы — уже изобретены базы данных :) запишите в БД значение expression до eval вашего жуткого и удалите после него.