Это сообщение об отсутствии информации об источнике является информационным сообщением, а не ошибкой. Это говорит о том, что вы пытаетесь выполнить один шаг с отладчиком через часть вашей программы, для которой у отладчика нет исходного кода. В результате вы можете пройтись по программе, просматривая ассемблер, сгенерированный отладчиком, но отладчик не может показать вам фактический исходный код программы в точке, которую вы сейчас просматриваете.
Исправление для этого - получить исходный код и сделать его доступным для отладчика.
Однако вам может и не понадобиться это.
То, как это звучит, происходит следующим образом.
Вы проходите через программу с помощью отладчика, и в какой-то момент функциональность 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, просто нажмите «Выполнить», чтобы продолжить.