Как я могу отлаживать библиотеки DLL C ++, подключенные во внешнем приложении C # (которое нельзя запустить из отладчика)

Я много думал об этой проблеме и решил, что оптимальное решение должно следовать двум правилам.

  1. Для масштабируемости измените массив на месте; никакое копирование в новый массив
  2. Для производительности каждое сравнение должно выполняться только один раз

Учитывая это и учитывая все причуды PHP, ниже приведено решение I придумал. В отличие от некоторых других ответов, он имеет возможность удалять элементы на основе любого ключа (ов), который вы хотите. Ожидается, что входной массив будет числовым.

$count_array = count($input);
for ($i = 0; $i < $count_array; $i++) {
    if (isset($input[$i])) {
        for ($j = $i+1; $j < $count_array; $j++) {
            if (isset($input[$j])) {
                //this is where you do your comparison for dupes
                if ($input[$i]['checksum'] == $input[$j]['checksum']) {
                    unset($input[$j]);
                }
            }
        }
    }
}

Единственным недостатком является то, что клавиши не в порядке, когда итерация завершается. Это не проблема, если впоследствии вы используете только петли foreach, но если вам нужно использовать цикл for, вы можете поместить $input = array_values($input); после этого, чтобы перенумеровать ключи.

0
задан bartoli 19 March 2019 в 16:37
поделиться

1 ответ

Вы говорите: «Я пытался запустить программу как внешнюю программу отладки C ++ DLL ... Но я думаю, что эти параметры могут быть проигнорированы, так как я не могу запустить exe в отладчике ...». Я думаю, что это может быть, где вы идете не так.

Вам нужно установить проект C ++ DLL в качестве запускаемого проекта (щелкните проект правой кнопкой мыши и выберите «Set as StartUp Project»). Затем откройте страницы свойств для проекта и в разделе «Отладка» в поле «Команда» введите полный путь к исполняемому файлу приложения. Введите любые аргументы командной строки, необходимые в поле Command Arguments. Также убедитесь, что ваш проект DLL генерирует PDB в C ++ / General. Очистите и перестройте проект DLL.

Установите точку останова в функции, которую вы ожидаете вызвать - в идеале, где-то рядом с точкой входа, и еще одну точку останова в коде, который вы хотите отладить. Теперь начните отладку (F5). Приложение должно запуститься (точки останова, вероятно, будут выглядеть «выдолбленными» с сообщением о том, что точка останова не привязана или похожа - пока не беспокойтесь об этом). Выполните все действия, необходимые в приложении для вызова собственной библиотеки DLL. Когда DLL и ее PDB загружены, точки останова должны выглядеть непрозрачными и попадать при выполнении строки кода.

Если точка останова не достигнута / не привязана, я бы предложил скопировать C ++ DLL и ее PDB в исполняемую папку приложения, чтобы уменьшить вероятность загрузки неправильной DLL. Затем перезапустите отладчик. Если ваше приложение программно устанавливает рабочую папку, попробуйте скопировать также DLL / PDB в это место.

Если это не удается, это может быть связано с тем, что вызывающий абонент выбирает конфигурацию, несовместимую с вызываемым абонентом. В общем случае не рекомендуется смешивать код режима отладки и выпуска, особенно при сортировке данных. Перестройте библиотеку DLL в режиме выпуска, включая PDB, и выполните приведенные выше инструкции. Все еще возможно отладить код режима релиза, хотя иногда это бывает сложно из-за оптимизаций.

0
ответ дан pdm2011 19 March 2019 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: