标签 调试 下的文章

目标计算机上的 Visual Studio 远程调试器无法重新连接到此计算机。身份验证失败。

此问题非常头疼,搞了一上午,需要注意以下问题:

首先请将访问安全策略从仅来宾改为经典(控制面板->管理工具->本地安全策略->本地策略->安全选项->网络访问:本地账号的共享与安全模型)。某些时候开启的防火墙会引起比较大的访问问题,建议关闭防火墙

确保本地和调试机器当前系统登录的账号和密码一样

安装Visual Studio 2010的远程调试器。在VS2010的安装ISO里面搜索rdbgsetup,里面有三个架构版本的安装包,x86、x64、和ia64。

rdbgsetup

安装是根据您调试的程序架构版本,而不是操作系统架构版本。比如在x64的Win10调试Any CPU的.NET程序,那么需要安装x86的。如果安装运行了错误架构开启调试的时候VS会提示:

Visual Studio 远程调试监视器(MSVSMON.EXE)的 64 位版本不能用于调试 32 位进程或 32 位转储。请改用 32位版本。

error C2065: '_tcstoi64' : undeclared identifier

I aim to use _tcstoi64 to convert a char* buffer to __int64. but compile cannot pass.

error C2065: '_tcstoi64' : undeclared identifier _tcstoi64 is defined in TCHAR.h and I've already include TCHAR.h

I am using VC++ 6.0 SP6 with PSDK 2003 Feberary with _UNICODE defined.

my code:

#include <stdlib.h>
#include <TCHAR.H>
//..
__int64 iVal = _tcstoi64(szTest, NULL, 16);

众所周知CRT函数_ttoi64可以字符串转为数字,但仅限于十进制字符串。像0x34BF就没辙了。这个时候可以使用_tcstoi64第三个参数来指定进制。但是在VC6里面报错_tcstoi64未识别的标识符。原因是VC6的CRT库函数里面根本就没有这个函数! 不信请看下图。左边是VC6的TCHAR.H,右边是VC10的TCHAR.H凡是后面加了64的都没有支持。想想98年VC6出道的时候哪来神马64位哦。吼吼。。。

tcstoi64

参见MS Answer解答。

多次子类化造成Debug Assertion Failed! wincore.cpp Line: 320

一个普通的MFC程序Release下没有任何问题。其实可能还存在潜在的其他问题。今天为了调试内存泄漏的问题。把程序编译成Debug版然后开始调试就报断言失败。

这次的报错的地方在MFC的源文件wincore.cpp的320行。

BOOL CWnd::Attach(HWND hWndNew)
{
    ASSERT(m_hWnd == NULL);     // only attach once, detach on destroy
    ASSERT(FromHandlePermanent(hWndNew) == NULL);
        // must not already be in permanent map

    if (hWndNew == NULL)
        return FALSE;

    CHandleMap* pMap = afxMapHWND(TRUE); // create map if not exist
    ASSERT(pMap != NULL);

    pMap->SetPermanent(m_hWnd = hWndNew, this);

#ifndef _AFX_NO_OCC_SUPPORT
    AttachControlSite(pMap);
#endif

    return TRUE;
}

320行在:

ASSERT(m_hWnd == NULL);

一个普通的对话框程序要动态创建三个对话框。单步调试到第一个没问题。第二个走到 CXXDlg->Create(....)的时候就报Asserting Failed。

这次应该想到第二个对话框的一些特殊的代码。没错。我子类化了一个CEdit。

我写了一个CExtEdit类。并且用ClassWizard绑定了一个变量CExtEdit m_ctlExtEdit。完了还在CXXDlg::OnInitDialog()里面加入了m_ctlExtEdit.SubClassDlgItem(...)。这样就造成了m_ctlExtEdit的重复子类化。

解决的方法有两个:

  1. 用ClassWizard去掉变量绑定m_ctlExtEdit,动态的创建一个CExtEdit。
  2. 去掉多余的.SubClassDlgItem函数。