как исправить это сообщение об ошибке «источник не доступен» в VS 2015 - PullRequest
0 голосов
/ 01 июля 2019

Когда я запускаю свой код, я получаю эту ошибку:

"source information is missing from the debug information for this module."

Я использую обратные вызовы в моем коде на C ++ концерт CPLEX. Когда я запускаю код без использования обратного вызова, я не вижу сообщения об ошибке, но когда я использую обратный вызов, я вижу сообщение об ошибке. Некоторые параметры в моем коде - матрица 10 * 5. Когда я запускаю код с матрицей 5 * 5, я не получаю никакой ошибки, но с матрицей 10 * 5 я получаю ошибку.

У меня нет никакой информации о файлах dll и PDB. Я не знаю, как исправить эту ошибку в Visual Studio 2015 на Windows 10? Я прочитал несколько статей об этой ошибке в StackOverflow, но перепутал и не знаю, какая из них подходит для моей проблемы.

1 Ответ

1 голос
/ 01 июля 2019

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

Исправление для этого - получить исходный код и сделать его доступным для отладчика.

Однако вам может и не понадобиться это.

То, как это звучит, происходит следующим образом.

Вы проходите через программу с помощью отладчика, и в какой-то момент функциональность CPLEX, которая выполняет какую-то асинхронную задачу параллельно с той частью программы, через которую вы проходите, начинает выполнять какое-то действие, которое будет в результате ваш обратный вызов срабатывает. Текущая инструкция находится в функциональности CPLEX, и отладчик не имеет доступа к исходному коду и описательной информации в файле .pdb, сгенерированном компилятором.

Эта статья, Укажите символы (.pdb) и исходные файлы в отладчике Visual Studio (C #, C ++, Visual Basic, F #) , об отладчике Visual Studio можно сказать об информационном сообщении вы видите:

Есть несколько способов, которыми отладчик может взломать код, который делает нет доступных символов или исходных файлов:

  • Шаг в код.
  • Взломать код из точки останова или исключения.
  • Переключиться на другой поток.
  • Измените кадр стека, дважды щелкнув кадр в окне Call Stack.

Фон для обратных вызовов и асинхронной обработки

Некоторая справочная информация о концепции обратного вызова: Статья в Википедии Обратный вызов (компьютерное программирование) , Что такое функция обратного вызова? , Что такое "обратный вызов" в C и как они реализованы? .

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

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

Обходные процедуры отладки

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

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

Однако, если эта функциональность является однопоточной, вы можете просто установить точку останова в обратном вызове, а затем, когда обратный вызов будет вызван функциональностью CPLEX, выполнение перейдет к этой точке и достигнет точки останова.Затем вы можете выполнить пошаговое выполнение функции обратного вызова, а когда она вернется к функциональности CPLEX, просто нажмите «Выполнить», чтобы продолжить.

...