小编zar*_*zar的帖子

如何在Visual Studio中调试库的发行版本

我需要调试链接库的发布版本.我已经在本文之后使用我的发布版本生成调试信息,但是我如何对库项目执行相同的操作?请注意,库项目在属性中没有链接页面,其中在上面的链接中创建了调试信息.我正在使用VS2010.

我真正想要的是让TRACE在调试库时工作.我试图将调试版本的库与发布exe链接,但它会创建链接器错误.

c++ debugging mfc visual-studio-2010 visual-studio

5
推荐指数
1
解决办法
1817
查看次数

调试器不会进入MFC源代码

我在VS2010中有一个新的SDI项目,但我无法进入MFC源.我按照这里的步骤,似乎资源符号由于某些原因没有加载,但它不会加载右键点击,如在那里最投票的答案中所述.

当我进入调试>> Windows>模块时,该窗口将符号状态列显示为Cannot find or open the PDB file.我猜这是问题,但是当我右键单击任何一个模块(例如mfc100enu.dll)时,我得到另一个带有类似消息的对话框,但找不到符号文件.

什么可能出错,它找不到符号文件以及如何解决这个问题?

模块窗口

我想要介入的功能LoadFrame在我的基本SDI应用程序的下面.

BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext) 
{
    // base class does the real work

    if (!CFrameWndEx::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext))
    {
        return FALSE;
    }

...
}
Run Code Online (Sandbox Code Playgroud)

任何提示我怎么不加载它们可能是错的?谢谢

更新

我可以通过转到Tools-> Options-> Debugging-> Symbols并选择复选框"Microsoft Symbol Servers"来启动VS2010以加载符号文件,现在Visual Studio会自动加载PDB.但是我仍然无法进入这个功能.

c++ mfc visual-studio-2010 visual-c++

5
推荐指数
3
解决办法
5161
查看次数

为什么'this'指针在单步执行代码时会改变它的值?

我正在调试崩溃,我注意到作为调试器的一步,this指针改变其值,经过3个步骤后,它最终得到值0x00000001并且应用程序崩溃.

现在0x00000001值显然是错误的,但是this当我逐步调试调试器时,我真的期望值会改变吗?

下面是我正在调试崩溃的构造函数.我已经this在每个步骤的注释中包含了指针的值,你可以看到它跳了很多.

CADOCommand::CADOCommand(CADODatabase* pAdoDatabase, CString strCommandText, int nCommandType)
{
    m_pCommand = NULL;
    m_pCommand.CreateInstance(__uuidof(Command)); // this = 0x515f9d10
    m_strCommandText = strCommandText; // this = 0x2c0c0ee8
    m_pCommand->CommandText = m_strCommandText.AllocSysString(); // this = 0x515f9d20
    m_nCommandType = nCommandType; // this = 0x70847a55
    m_pCommand->CommandType = (CommandTypeEnum)m_nCommandType; // this = 0x00000001
    m_pCommand->ActiveConnection = pAdoDatabase->GetActiveConnection(); 
    m_nRecordsAffected = 0;
}
Run Code Online (Sandbox Code Playgroud)

this我们单步执行给定成员函数中的代码时,是否存在可能或应该更改的值?

更新

我必须添加记录并回应几条评论,我正在调试发布版本,但是当我在调试版本中调试相同的函数时,其值this并没有改变.

那么这意味着什么,仅在发布版本中存在问题吗?

@drescherjm的评论是赞成的,in release mode the this pointer is not correct because of optimization …

c++ debugging windbg

5
推荐指数
1
解决办法
687
查看次数

加密和序列化stl字符串和其他容器

我在stl容器中有数据(向量).向量中的每个节点都是一个也包含stl字符串的结构.

struct record
{
string name;
string location;
int salary;
}

vector< record > employees;
Run Code Online (Sandbox Code Playgroud)

我想序列化员工,但我也希望在序列化之前对其进行加密.

我的加密函数如下所示:

Encode(const char * inBfr, const int in_size, char ** outBfr, int& out_size )
Run Code Online (Sandbox Code Playgroud)

通过搜索它看起来像stl标准不需要我的结构的内存是连续的所以我不能只是抓住employees变量的内存.有没有其他智能方法可以使用我的基于stl的结构/容器的编码功能?Encode函数在普通的char*缓冲区中运行对我来说很好,所以我确切地知道进出什么但stl结构不是,我想找到一个很好的方法,所以我可以使用stl与这个函数.

如果有帮助,我也开始使用任何其他stl容器.

c++ encryption serialization stl

4
推荐指数
2
解决办法
1255
查看次数

基类只有一个派生类时可以吗?

我正在使用OOD和设计模式创建密码模块.该模块将记录可记录事件的日志并读取/写入文件.我在基类中创建了接口并在派生类中实现.现在我想知道如果基类只有一个派生类,这是不是有点难闻.这种类层次结构是否不必要?现在要消除类层次结构,我当然可以在一个类中完成所有操作而不是派生,这是我的代码.

class CLogFile
{
public:
    CLogFile(void);
    virtual ~CLogFile(void);

    virtual void Read(CString strLog) = 0;
    virtual void Write(CString strNewMsg) = 0;
};
Run Code Online (Sandbox Code Playgroud)

派生类是:

class CLogFileImpl :
    public CLogFile
{
public:
    CLogFileImpl(CString strLogFileName, CString & strLog);
    virtual ~CLogFileImpl(void);

    virtual void Read(CString strLog);
    virtual void Write(CString strNewMsg);

protected:
    CString & m_strLog; // the log file data
    CString m_strLogFileName; // file name
};
Run Code Online (Sandbox Code Playgroud)

现在在代码中

CLogFile * m_LogFile = new CLogFileImpl( m_strLogPath, m_strLog );

m_LogFile->Write("Log file created");
Run Code Online (Sandbox Code Playgroud)

我的问题是,我一方面关注OOD主体并首先创建接口并在派生类中实现.另一方面,这是一种矫枉过正,它会使事情变得复杂吗?我的代码非常简单,不使用任何设计模式,但它通过派生类在通用数据封装方面确实从中获得了线索.

最终上面的类层次结构是好还是应该在一个类中完成?

c++ oop design-patterns

4
推荐指数
1
解决办法
310
查看次数

Windows API如何接受字符串

我必须承认,这总是让我困惑某些Windows API如何接受字符串.以SetWindowText()为例.现在任何带有指向任何东西的函数通常意味着它不存储该对象,而只是使用传递的指针.因此,调用者有责任确保传递给它的对象随时存在.那么您期望下面将打印出的最终消息是什么?

TCHAR * label = new TCHAR[50]();
_tcscpy( label, _T("allocated string") );
m_wndStaticLabel.SetWindowText( label );
_tcscpy( label, _T("string has changed") );
Run Code Online (Sandbox Code Playgroud)

理论上我希望它打印"字符串已更改"但它打印"已分配的字符串".同理:

CString label = _T("CString Label");
m_wndStaticLabel.SetWindowText( label );
Run Code Online (Sandbox Code Playgroud)

在这种情况下,一个局部变量'label`的指针正在传递给它,但仍然没有问题.控件总是打印正确的字符串,即使它收到堆栈上分配的字符串指针.

这意味着控件实际上分配了自己的内存,并将其分配给控件而不是我们传递的指针,但这一事实从未记录过.这有点误导吗?当我传递指向函数的指针时,我立即提醒自己的一件事是我不应该在函数返回之前销毁它,但在这种情况下不是这种情况,也没有记录.

所以我的问题最终只是缺少文档,或者当我们将指针传递给一个对象时它还有其他东西,但它的行为就像我们按值传递对象一样?

c++ winapi mfc pointers

4
推荐指数
1
解决办法
202
查看次数

如何在 Qt 的工作线程中休眠?

我正在创建一个示例来理解 Qt 中的线程,并希望我的工作线程在每次增量之间休眠 1 秒,以便我可以看到调试输出。但是睡眠使我的主 GUI 线程无响应。

这是我在OddCounter课堂上的插槽功能。

void OddCounter::count()
{
    for (int i = 0; i < 10; i++)
    {
        counter += 2;

        qDebug() << counter;

        QThread::sleep( 1 );
    }
}
Run Code Online (Sandbox Code Playgroud)

我调用这个线程的主窗口类是:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    oddCounter = new OddCounter;

    connect(this, SIGNAL(startOddCounter()), evenCounter, SLOT(count()), Qt::QueuedConnection );
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    OddCounter oddCounter;

    oddCounter.moveToThread( &thread );

    thread.start();

    emit startOddCounter();
}
Run Code Online (Sandbox Code Playgroud)

问题是当我按下按钮时,计数器工作并在每一秒过去后显示下一个增量,但主窗口一直没有响应!这个不对!我希望我的主窗口能够响应并且只有线程应该休眠。我怎么做?

c++ qt multithreading

4
推荐指数
1
解决办法
1292
查看次数

如何使用Qt禁用窗口的关闭按钮?

我想在操作开始时禁用窗口(主应用程序窗口)上的关闭按钮,这样用户无法退出应用程序并在操作完成时再次启用它.我怎么能在Qt应用程序中这样做?我的平台是Windows 7.

或者,如果用户按下关闭按钮并退出应用程序进程正在后台运行并中止关闭应用程序,我可以显示一条消息.

我该怎么办?

qt

4
推荐指数
1
解决办法
5268
查看次数

QML TreeView 的 C++ 模型

由于缺少任何其他 Qt 演示,我正在使用 Qt 小部件的SimpleTreeModel演示为我的 QML TreeView 实现 C++ 模型。我已经定义了角色,所以 QML 可以使用它,但我无法将它们与实际模型数据连接起来。

我还发现有趣的是小部件(C++)演示工作正常,但TreeModel似乎没有将数据存储为其成员变量..让我摸不着头脑。我发现了这一点,每个 TreeItem 都存储其所有子项,而 TreeModel 只有一个rootItem将所有数据存储为其子项。

TreeItem 类

class TreeItem
{
public:
    explicit TreeItem(const QList<QVariant> &data, TreeItem *parentItem = 0);
    ~TreeItem();

    void appendChild(TreeItem *child);

    TreeItem *child(int row);
    int childCount() const;
    int columnCount() const;
    QVariant data(int column) const;
    int row() const;
    TreeItem *parentItem();

private:
    QList<TreeItem*> m_childItems;
    QList<QVariant> m_itemData;
    TreeItem *m_parentItem;
};
Run Code Online (Sandbox Code Playgroud)

TreeModel 类

class TreeModel : public QAbstractItemModel
{
    Q_OBJECT

public:
    enum DisplayRoles …
Run Code Online (Sandbox Code Playgroud)

c++ qt qml qmodelindex

4
推荐指数
1
解决办法
2671
查看次数

内存转储文件到底是什么时候创建的?

我已将 Windows 7 配置为在崩溃时创建小型转储文件,但当我的应用程序崩溃时,没有创建转储文件。寻找答案让我很困惑,什么时候创建转储文件,什么时候 Windows 崩溃或我的应用程序崩溃?

就我而言,当我的应用程序崩溃时,我正在寻找转储文件。我收到一个典型的崩溃对话框,其中指出:

TheApp 应用程序已停止工作

Windows 可以在线检查问题的解决方案

-> 在线查看解决方案并关闭程序

-> 关闭程序

-> 调试程序

那么我可以在应用程序崩溃时为其生成转储文件吗?我无法在开发计算机上产生此错误,因此我想从转储文件返回。是否有其他选项可以追踪错误的来源(到源代码)?

c++ crash debugging windows-7

4
推荐指数
1
解决办法
3145
查看次数