Использование отладчика c ++ в качестве заменителя отражения - PullRequest
1 голос
/ 10 августа 2011

Этот вопрос в некоторой степени связан с , который я задал ранее на этой неделе .Я все еще имею дело с неспособностью C ++ правильно обдумать свой собственный код.Теперь, когда я наткнулся на несколько библиотек, которые каким-то образом пытаются добавить эту функциональность, я хотел бы спросить, нельзя ли добиться того, что мне нужно сделать, используя более легкодоступные и широко используемые (т.е. более простые в реализации) методы.

Что мне нужно, так это в основном снимок экземпляров объекта в определенный момент времени.Они могут иметь подобъекты (то есть некоторую структуру, в которой объект «имеет» один или несколько других объектов), но это в основном все.Теперь, когда рефлексия казалась очевидным выбором, это было в значительной степени исключено из-за того, что проекты всегда кодируются на C ++.Тем не менее, кажется, что отладчик делает именно то, что мне нужно (остановите программу в определенный момент и расскажите мне об экземплярах, находящихся в данный момент в памяти), поэтому я чувствую, что должен быть в состоянии добиться некоторого извлечения информации, используя простые методы отладки, каккод данных проектов можно считать доступным.Рабочий процесс в моей программе может выглядеть как

  1. компиляция кода C ++ в режиме отладки
  2. создание и подключение отладчика
  3. установка точки останова (как я знаю вызов метода, который указываетчтобы все необходимые экземпляры были созданы)
  4. запустить и проверить экземпляры (и подэкземпляры) определенного класса (и его унаследованных типов), извлечь эту информацию для дальнейшей обработки

Хотя это в основном то, что я обычно делаю во время отладки, я не смог найти никакой информации о том, как сделать это автоматически из другой программы.Это имело бы преимущество в виде ограниченного отражения без каких-либо дополнительных библиотек или изменений кода.Итак, есть ли какой-либо способ - предпочтительно в Java, C # или C ++, как я с ним наиболее знаком, - просто загрузить и скомпилировать решение VS или выполнить make-файл и выполнить действия, описанные выше?Я постоянно нахожу множество страниц, которые рассказывают мне, как использовать отладчик, но это действительно бесполезно ...

Спасибо за любую помощь.

Ответы [ 4 ]

3 голосов
/ 10 августа 2011

Если Visual Studio не обязателен, вы можете взглянуть на GDB . Этот отладчик может управляться программно, на самом деле он используется некоторыми графическими интерфейсами отладчика, поэтому вы должны иметь возможность выполнять шаги 2-4 с ним. Для первого шага очевидным выбором в этом контексте является gcc.

1 голос
/ 10 августа 2011

Что ж, поскольку из вашего другого вопроса очевидно, что вашей платформой является Windows, вы можете сделать это в принципе с помощью windbg и связанных с ним (только для командной строки) отладчиков, доступных в пакете средств отладки для Windows или Windows SDK.

С его помощью вы можете легко выполнять задачи со 2 по 4 в автоматическом режиме - хотя я думаю, что 4 (автоматическая проверка на наличие экземпляров) не может быть выполнена автоматически для собственного (C ++) кода, поскольку, как вы уже упоминали, в C ++ нет что-то вроде механизма отражения в .net-коде.

Теперь я не уверен, что все эти усилия будут стоить того. Если все, что вы пытаетесь сделать, - это отладить / настроить приложение, вы можете использовать условную компиляцию для кода отладки / выпуска и добавить дополнительный код для целей трассировки.

0 голосов
/ 01 октября 2011

Если вы пытаетесь увидеть, что было выделено в определенный момент выполнения вашей программы, вам может помочь профилировщик кода. Профилировщик кода может показать вам снимки того, что ваш код делает в определенные моменты времени. В Linux популярным выбором является valgrind. В Visual Studio должен быть профилировщик, хотя я никогда не использовал его.

0 голосов
/ 01 октября 2011

Не могли бы вы просто преобразовать код в приложение .NET и использовать отражение .NET?

...