【发布时间】:2016-04-21 23:43:03
【问题描述】:
我想查看从项目中读取函数定义的位置,因为它既不是我期望的位置,也不是 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;
我已经浏览了 应该 到这里的源代码,并用断点填充它。他们没有被击中,我设置的控制台输出都没有。
【问题讨论】:
-
您尝试过步入选项吗?使用 F-11 你可以追踪它。你可以在每个地方设置断点,以查看它何时何地击中
-
是的,我试过了。调试器根本看不到该代码,因此即使是“步入”也直接飞过所有内容(并且在其中某处抛出异常)
-
发布没有进入的那一行代码,以及它引发错误的地方的代码
-
@FirstStep 我现在已经做到了。希望清楚
标签: c++ c visual-studio-2015