我想查看从项目中读取函数定义的位置,因为它既不是我期望的位置,也不是VS2015中声称的“转到定义”的位置。

我有一个调用静态库的应用程序,该库调用了第二个静态库,所有静态库都作为解决方案包含在Visual Studio中,并且两个库都包含为该应用程序的项目依赖项。当我从第一个库转到在代码中第二个库中定义的函数的任何调用,然后右键单击->“转到定义”时,它将带我到第二个库中的正确位置。

但是,它在运行时肯定无法从该源获取功能,因为它返回了错误的答案,并且没有给出我为调试此问题而添加的控制台输出。我编写的另一个(玩具)应用程序用来检查代码,并且在另一个包含库的解决方案中,它正确地使用了定义。

如果在调试时单击这些功能,则提示源不可用。显然,它是从某个地方读取定义的,我可以看一下反汇编。在查看了所有项目的属性,并在计算机上搜索了第二个库的其他版本之后,我仍然不知道从何处可以得到不同的定义。因此,了解调试器/编译器从何处读取已编译的代码将很有用,它可以从中生成反汇编(并执行功能)。

从我期望的位置执行的最后一行代码是:

dgstrf(opPt, column_permuted, relax, panel_size, etree, NULL, 0, col_perm_pt, row_perm_pt, lower, upper, glu, stats, status);


根据“转到定义”,它应调用以以下内容开头的函数:

void
dgstrf (superlu_options_t *options, SuperMatrix *A,
    int relax, int panel_size, int *etree, void *work, int lwork,
    int *perm_c, int *perm_r, SuperMatrix *L, SuperMatrix *U,
    GlobalLU_t *Glu, /* persistent to facilitate multiple factorizations */
    SuperLUStat_t *stat, int *info)
{
    printf("doing dgstrf\n");
 ...


一段时间后调用:

*info = dLUMemInit(fact, work, lwork, m, n, Astore->nnz,
                   panel_size, fill_ratio, L, U, Glu, &iwork, &dwork);


开始于:

int
 dLUMemInit(fact_t fact, void *work, int lwork, int m, int n, int annz,
      int panel_size, double fill_ratio, SuperMatrix *L, SuperMatrix *U,
          GlobalLU_t *Glu, int **iwork, double **dwork)
{
   printf("doing dLUMemInit\n");...


依次调用dLUWorkInit-> intCalloc,然后调用在实际应用程序中运行的版本(但不能在有效的玩具应用程序中运行)-> superlu_abort_and_exit-> fprintf

fprintf(在stdio.h中)是自我对dgstrf的包装函数以来的第一件事,为此调用堆栈说它具有源代码。

它将引发异常“访问冲突写入位置0x0000000000000024”。在线上

__crt_va_start(_ArgList, _Format);
_Result = _vfprintf_l(_Stream, _Format, NULL, _ArgList);
__crt_va_end(_ArgList);
return _Result;


到目前为止,我已经遍历了源代码,并在其中填充了断点。它们没有命中,我设置为产生的任何控制台输出都没有。

最佳答案

对于我的特殊情况,我通过询问同事是否可以想到可能会干扰的任何其他依赖关系,来找出替代定义的来源。不是最令人满意的解决方案,但它会做到。

关于c++ - 当源不可用时,找到Visual Studio 2015调试器从何处读取符号defs,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36750265/

10-09 08:27
查看更多