Возможно ли узнать сигнатуру виртуального метода из рантайма?
Сам спросил, сам нашёл решение (пусть и не универсальное)
Можно с высокой долей вероятности успешно вычислить сигнатуру метода по глубине стека, на которую обращаются инструкции. Для этого потребуется дизассемблировать метод и отследить регистры связанные со стеком.
Рабочий прототип отслеживающей процедуры для моего случая можно найти тут. Прототип написан на Nim с использованием libopcode и libbfd из пакета binutils, который входит в большинство дистрибутивов линукс.
На скриншоте результат подобного угадывания количества аргументов методов (CAdapterSteamClient017, справа) и (слева) кусок исходника, соответствующий данному классу. (надеюсь, Valve меня не забанят за публикацию скриншота с маленьким куском исходников)
Как видно из скриншота, предсказанное количество аргументов соответствует реальному.
возможно ли на уровне рантайма узнать сколько аргументов было помещено в стек перед вызовом виртуального метода (по виду стека, по виртуальной таблице объекта или другой информации доступной в рантайме)?
Традиционно в C++ типы параметров функции кодируются компилятором в её имени.