如何在VS 2015中修复此错误消息“源不可用”

时间:2019-07-01 11:05:15

标签: visual-studio visual-c++ visual-studio-2015 cplex

运行代码时,出现此错误:

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

我在C ++ Concert CPLEX的代码中使用回调。当我在不使用回调的情况下运行代码时,我没有看到错误消息,但是在使用回调时,我却看到了错误消息。我的代码中的某些参数是矩阵10 * 5。当我使用矩阵5 * 5运行代码时,我没有得到任何错误,但是使用矩阵10 * 5运行时,我得到了错误。

我没有有关dll和PDB文件的任何信息。我不知道如何在Windows 10的Visual Studio 2015中解决此错误?我在StackOverflow上阅读了有关此错误的一些主题,但是我很困惑,我不知道哪个对我的问题有好处。

1 个答案:

答案 0 :(得分:1)

有关源信息丢失的此消息是参考消息,并不是真正的错误。这意味着您正在尝试通过调试器没有源代码的程序部分来与调试器进行单步调试。结果是,您可以单步查看该调试器生成的汇编程序,但是调试器无法在您当前要显示的位置显示该程序的实际源代码。

此问题的解决方法是获取源代码并将其提供给调试器。

但是您可能不需要这样做。

听起来是这样的。

您正在使用调试器逐步执行程序,并在某些时候使用CPLEX功能,与正在执行的程序部分并行地执行某种异步任务,该操作将开始执行某种操作,该操作将导致您的回调被触发。当前指令位于CPLEX功能之内,调试器无权访问由编译器生成的.pdb文件中的源代码和描述性信息。

这篇关于Visual Studio调试器的文章Specify symbol (.pdb) and source files in the Visual Studio debugger (C#, C++, Visual Basic, F#)旨在说明您所看到的参考消息:

  

调试器可以通过多种方式将代码分解为   没有可用的符号或源文件:

     
      
  • 进入代码。
  •   
  • 从断点或异常进入代码。
  •   
  • 切换到其他线程。
  •   
  • 通过双击“调用堆栈”窗口中的框架来更改堆栈框架。
  •   

回调和异步处理的背景

有关回调概念的一些背景信息:Wikipedia article Callback (computer programming)What is a callback function?What is a "callback" in C and how are they implemented?

当您不使用回调时,不会执行异步任务,CPLEX的使用是同步的,因为您对CPLEX函数进行了调用,返回了结果,然后在等待结果。使用异步,您可以调用CPLEX功能来启动异步任务,然后立即返回而不完成,并期望任务完成后会触发您的回调。

当CPLEX触发回调时,由于您是单步执行,并且程序在调试器中将控制权突然转移到CPLEX功能中的一个步骤和下一个步骤之间,因此您突然要单步执​​行CPLEX源代码,但是调试器没有那个来源。因此,它会发布一条信息性消息,告知您找不到源,并为您提供其他选择。

解决方法调试步骤

在这种情况下,我要做的是在回调中设置一个断点,这样,如果我再执行Run命令,就会触发该回调,然后执行将在源中的那个断点处停止,然后我可以继续执行逐步了解回调函数的来源。

您可能会遇到的问题是,回调在一个线程上,而您遵循的另一个执行路径在另一个线程上。然后,发生的事情是调试器在两个执行线程之间交换,并且随着运行线程从程序中的一个位置更改为另一个位置,单步执行变得更加困难。为了解决这个问题,通常需要设置断点或使用调试器手动更改当前正在执行的线程。

但是,如果此功能是单线程的,则您应该能够仅在回调中设置断点,然后当CPLEX功能触发回调时,执行将跳至该点并达到断点。然后,您可以单步执行回调功能,当它返回到CPLEX功能时,只需按Run即可继续。