For similar insructions in English, please see RPI CSCI1200 instructions.

程序内存调试

程序内存错误有很多种,比如内存访问错误(segmentation fault),读取未初始化的数据,数组越界读/写,内存泄漏等等。这些内存错误通常很难通过传统的程序调试器追查出真正原因。内存错误有时不会导致程序立即崩溃。有些有内存错误的程序甚至可能在一些机器上或数据集上正常工作。这些使得追查内存错误更加困难。

Dr. Memory

Dr. Memory可在Linux,Windows,MacOSX,和Android操作系统上使用。如有问题,错误报告和讨论,请使用Dr. Memory用户邮件群:http://groups.google.com/group/drmemory-users

请通过发邮件至Dr. Memory用户组 报告有关使用Dr. Memory的问题。报告中务必写明操作系统和Dr. Memory版本号等详细信息。

Dr. Memory在Linux或Mac OSX

  1. 从https://github.com/DynamoRIO/drmemory/wiki/Downloads下载对应操作系统的Dr. Memory压缩(tar.gz)文件。
  2. 保存并解压包到您选择的目录。比如使用命令:
    tar -xvzf DrMemory-YourOperatingSystem-VersionXX.tar.gz
    从现在起,我们假设DrMemory存在在目录 ~/DrMemory-YourOperatingSystem/。
  3. Dr. Memory可以用在32位或64位程序上(只在Linux上),但针对32位程序,Dr. Memory能追踪和报告更多类型的内存错误。所以建议你最好能建立和运行32位应用程序。在64位的Ubuntu操作系统上,你可能会想安装这些额外的软件包:
    sudo apt-get install g++-multilib
  4. 你可以在你的编译器中使用-m32,从而编译和生成32位程序。请务必使用-g选项生产调试信息。例如:
    g++ -g -m32 main.cpp foo_main.cpp foo_other.cpp -o foo.out
  5. 在Dr. Memory中运行你的程序。例如:
    ~/DrMemory-YourOperatingSystem-VersionXX/bin/drmemory -brief -- foo.out arg1 arg2
    使用你的可执行文件和命令行参数替换“foo.out arg1 arg2”。
  6. Dr. Memory会在运行过程中将错误打印在屏幕上,同时在程序终止时打印所发现错误摘要。

在Windows上安装Dr. Memory

  1. 获取Dr. Memory。您可以下载和运行安装程序(.msi文件)将Dr. Memory安装在系统路径上。或者,您可以下载.zip文件在本地直接使用而无须安装。https://github.com/DynamoRIO/drmemory/wiki/Downloads
  2. 在.msi文件双击运行安装程序。
    单击下一步;
    勾选接受许可证,然后单击下一步:
    你可以安装Dr. Memory在默认位置( C:\Program Files (x86)\Dr. Memory\);
    单击下一步;
    点击安装;
    你会被要求确认是否要对机器进行管理更改;
    快速安装后,按完成。
  3. 请按照下面的说明来编译和使用MinGW g++,Visual Studio IDE,或Visual Studio命令提示符运行程序。

Dr. Memory和MinGW

Dr. Memory不支持使用Cygwin模拟层的程序。因此,我们不能将Dr. Memory用在Cygwin内置g++编译的程序。我们需要改用MinGW g++编译器(Minimalist GNU for Windows)编译我们的程序:

  1. 确保安装MinGW的G ++编译器。详情参见Cygwin的安装说明
  2. 打开Cygwin的终端,进入到存放你的源代码文件的目录,然后使用MinGW的编译器编译程序:
    i686-pc-mingw32-g++.exe -static-libgcc -static-libstdc++ -ggdb -o foo.exe foo_main.cpp foo_other.cpp
  3. 您可以通过使用以下命令在Dr. Memory下运行程序:
    drmemory -brief -batch -- foo.exe arg1 arg2
    用你的程序名称和程序的命令行参数替换 “foo.exe arg1 arg2:。

Dr. Memory和Visual Studio

您也可以将Dr. Memory用在微软的Visual Studio编译器编译的程序:

  1. 用Visual Studio编译你的应用程序成32位程序(32位是默认编译目标)。请务必确认生成调试信息。您可以通过查看编译目标的属性来验证你的程序是否包含调试信息:
    按Alt-F7,弹出配置属性;
    在“配置属性| C / C ++ |常规”(Configuration Properties | C/C++ | General)中,“调试信息格式”(Debug Information Format)项要么说“程序数据库(/Zi)”或者“编辑程序数据库并继续(/ZI)”;
    此外,在“配置属性|链接|调试”(Configuration Properties | Linker | Debugging)中,“生成调试信息”(Generate Debug Info)项应该是“Yes(/DEBUG)”。如果是Visual Studio 2015,在“配置属性|链接|调试”(Configuration Properties | Linker | Debugging)中,“生成调试信息”(Generate Debug Info)项应为“优化调试Optimized for debugging(/ DEBUG)” - 它不应该是“优化连接速度Optimized for faster linking(/ DEBUG:FASTLINK) “。
  2. 禁用动态检查:Visual Studio编译器的/RTC1选项会干扰Dr. Memory,使其无法发现读取未初始化的读取局部变量的程序错误,而/RTC1自带的检查读取未初始化变量功能不如Dr. Memory的有效。然而,/RTC1会进行堆栈检查,而Dr. Memory没有此功能,所以要取得最好的效果,你的应用程序应该在使用Dr. Memory时禁用/RCT1,而在不使用Dr. Memory时开启/RTC1。
    在Visual Studio IDE中,按下Alt + F7,然后在“配置属性| C / C ++ |代码生成(Configuration Properties | C/C++ | Code Generation)”确保“基本运行时检查(Basic Runtime Checks)”设置成“默认(Default)”。
  3. 较新版本的Dr. Memory安装程序(1.8及更高版本)会安装Dr. Memory成Visual Studio的“外部工具(External Tool)”。它添加了一个新的菜单项,使你可以在IDE中直接运行Dr. Memory。
    现在,您可以选择“工具(Tools)|Dr. Memory”菜单项,Visual Studio则将在Dr. Memory中运行您的应用程序。你可以在“$(TARGETPATH​​)”之后在结尾处添加参数。
  4. Dr. Memory(连同你程序)的输出将被打印到Visual Studio输出窗口。在程序运行中,Dr. Memory将错误报告打印在屏幕。并在程序终止时打印所发现的错误的摘要。您可以通过双击错误报告中的文件行而自动打开该文件并跳转到指定的行号。

使用Visual Studio编译没有Visual Studio集成开发环境(IDE)

    1. 启动Visual Studio命令提示符。从开始菜单,在所有程序,找到你的Visual Studio版本(例如,2010),并展开它。然后,展开Visual Studio工具。选择“Visual Studio 2010的命令提示符”。 (请不要使用64位(x64)或交叉工具(Cross Tool)的版本。)
      注意:这不是Cygwin的命令窗口。
      此命令提示符程序是一个执行了附带的Visual Studio的批处理文件命令的提示符程序的窗口。这个批处理文件称为vcvars.bat,它设置了为运行在命令行编译器所需的路径和环境变量。
      注意:您可以从批处理文件中提取环境变量并在你的.bashrc设置它们,这样你就可以从Cygwin中编译程序。
    2. 在命令行,进入到包含程序源文件的目录。
    3. 运行编译器,它被称为“cl”。这会在当前目录中编译所有的.cpp文件并生成hw.exe:
      cl /Zi /MT /EHsc /Oy- /Ob0 /Fehw.exe *.cpp
    4. 如果你之前是安装的Dr. Memory,你可以直接运行drmemory。例如:
      drmemory -brief -- foo.exe arg1 arg2
      运行此命令,请用可执行文件名和命令行参数替换 “foo.exe arg1 arg2”。
      如果在程序运行中您没有看到任何额外的从Dr. Memory打印的输出,去掉-batch,Dr. Memory的输出将被写入一个文件,记事本程序将自动启动并显示此文件:
      drmemory -brief -- foo.exe arg1 arg2
    5. Dr. Memory将在程序终止时打印关于它发现的程序错误的摘要。

Dr. Memory Quickstart Instructions in Chinese的更多相关文章

  1. Dr.memory

    Run Dr.memory on visual c++ 2013 Title: Dr. Memory Command: C:\Program Files (x86)\Dr. Memory\bin\dr ...

  2. Cortex-M3 and Cortex-M4 Memory Organization

    http://www.mikroe.com/download/eng/documents/compilers/mikropascal/pro/arm/help/memory_organization. ...

  3. System and method for parallel execution of memory transactions using multiple memory models, including SSO, TSO, PSO and RMO

    A data processor supports the use of multiple memory models by computer programs. At a device extern ...

  4. Synthesis of memory barriers

    A framework is provided for automatic inference of memory fences in concurrent programs. A method is ...

  5. Method and apparatus for speculative execution of uncontended lock instructions

    A method and apparatus for executing lock instructions speculatively in an out-of-order processor ar ...

  6. 长短时间记忆的中文分词 (LSTM for Chinese Word Segmentation)

    翻译学长的一片论文:Long Short-Term Memory Neural Networks for Chinese Word Segmentation 传统的neural Model for C ...

  7. memory ordering 内存排序

    Memory ordering - Wikipedia https://en.wikipedia.org/wiki/Memory_ordering https://zh.wikipedia.org/w ...

  8. 如何在 arm 官网上找到合适的手册

    http://infocenter.arm.com/help/advanced/help.jsp 在这里输入合适的版号即可 这样就可以不用去 CSDN 了 100000_0000_00_EN - AR ...

  9. libyuv编译(各平台)【转】

    转自:http://blog.csdn.net/wszawsz33/article/details/51669719 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] Getti ...

随机推荐

  1. [基础]斯坦福cs231n课程视频笔记(一) 图片分类之使用线性分类器

    线性分类器的基本模型: f = Wx Loss Function and Optimization 1. LossFunction 衡量在当前的模型(参数矩阵W)的效果好坏 Multiclass SV ...

  2. 机器学习(4)——PCA与梯度上升法

    主成分分析(Principal Component Analysis) 一个非监督的机器学习算法 主要用于数据的降维 通过降维,可以发现更便于人类理解的特征 其他应用:可视化.去噪 通过映射,我们可以 ...

  3. paxos算法—今生

    Paxos 定义2.1  票:即弱化形式的锁.它具备下面几个性质: 可重新发布:服务器可以重新发布新票,即使前面发布的票没有释放. 票可以过期:客户端用一张票来给服务器发送命令请求时,只有当这张票是最 ...

  4. Lerp在X秒内插值

    在X秒内插值 我们知道Mathf.Lerp函数的是用在两个值之间进行插值,用于平滑过渡. var 插值结果 = Mathf.Lerp(from,to,rate) //rate是0~1的值 Unity没 ...

  5. JS高阶---继承模式(原型链继承)

    [前言] 之前已经介绍了对象创建的五种模式,下面看下继承模式 本节介绍下<原型链继承> [主体] 验证如下: 关键点: .

  6. CPDF_Document

    auto pDoc = std::unique_ptr<CPDF_Document>(); pDoc->CreateNewDoc(); auto pDict = CPDF_Dicti ...

  7. Sharding-JDBC 学习资料

    学习资料 网站 官网 https://shardingsphere.apache.org/document/current/cn/manual/sharding-jdbc/ 基于 Docker 的 M ...

  8. 莫烦TensorFlow_01 基本程序结构

    import tensorflow as tf import numpy as np # create data x_data = np.random.rand(100).astype(np.floa ...

  9. leetcode138. 复制带随机指针的链表

    思路一:哈希 借助哈希保存节点信息. 代码 时间复杂度:O(n)空间复杂度:O(n) class Solution{ public: Node* copyRandomList(Node* head) ...

  10. 使用lombok的利弊

    使用lombok的好处是:1.减少大量的模板代码,get和set方法,从代码封装维度看,将大量的模板代码进行封装,不需要其他人员来不断编写,哪怕是IDE可以生成的代码,这也是重复代码,减少重复的出现; ...