Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >逆Heisenbug -只有在附加调试器时单元测试才会失败

逆Heisenbug -只有在附加调试器时单元测试才会失败
EN

Stack Overflow用户
提问于 2010-11-24 17:10:54
回答 4查看 816关注 0票数 4

我最近修复了我们产品中的一个缺陷,其症状是访问一个悬空指针所造成的访问冲突。

为了提供良好的实践,我添加了一个单元测试,以确保bug不会再次出现。在编写单元测试时,我将始终退出缺陷修复,并确保单元测试失败,否则我知道它没有正确地完成它的工作。

退出缺陷修复后,我发现我的单元测试仍然通过(不太好)。当我将调试器附加到单元测试以查看它为什么通过时,测试失败(即抛出异常),我可以中断并观察到调用堆栈与我修复的原始缺陷中的调用堆栈匹配。

我没有修改Visual 2005中的“中断异常”设置,这确实是一个关键的Win32异常,它导致测试工具终止(即没有优雅的异常处理程序)。

例外的案文是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Unhandled exception at 0x0040fc59 in _testcase.exe: 0xC0000005:
Access violation reading location 0xcdcdcdcd.

注意:的位置并不总是0xcdcdcdcd (allocated but unwritten Win32 heap memory)。有时是0x00000000,有时是另一个地址。

这似乎与传统的Heisenbug相反,在通过调试器观察它时,问题就会消失。在我的例子中,通过调试器观察它会出现问题!

我最初的想法是,这是一个种族条件暴露在调试器的时间差异。但是,当我将跟踪添加到代码并与调试器分开运行时,打印出来的数据向我表明,应用程序应该以与在调试器下运行时类似的方式中止。但事实并非如此!

对于造成这种情况的原因,有什么建议吗?

更新:,我正在缩小这个问题的原因。有关更多详细信息,请参阅this question。如果我找到答案就会更新这个问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-24 22:13:43

我已经隔离了这个问题的原因--详见this question

当在调试器下运行我的测试工具时,调试环境消耗的内存意味着相同对象的后续分配/释放总是在内存的不同的部分中分配。这意味着当我的测试工具试图访问一个悬空指针时,它会使测试崩溃(从技术上讲,这是未定义的行为,但这是测试代码,它似乎完成了我需要它做的事情)。

当从命令行运行我的测试工具时,相同对象的后续分配/释放总是重复使用相同的内存块。这种奇怪的行为意味着当我访问实际上是测试用例中的一个悬空指针时,这个悬空指针仍然指向一个有效的对象。所以我才没看到车祸。

票数 0
EN

Stack Overflow用户

发布于 2010-11-24 19:45:14

通常,当您删除指向该内存的指针时,VC++调试器将用一些已知值填充堆分配的内存。自从我使用Visual以来已经有很长一段时间了,但是在我看来,0xcddcdcd可能是这样一个值是合理的。在我看来,应用程序在调试器中运行时很可能会崩溃。在发布模式下运行时,运行时不会浪费时间来覆盖已释放的内存,因此有些时候您会感到“幸运”,而存储在该内存中的数据仍然有效。

您可以修改构建设置,打开在发布模式下使用已知值填充已分配内存的选项(完成后不要忘记再次关闭它)。我猜如果您这样做,您的应用程序将在发布模式下崩溃。

我理解这个值并不总是0xcdcddcd,这可能意味着我错了,或者可能意味着您有多条指向悬空指针的路径。

票数 3
EN

Stack Overflow用户

发布于 2010-11-24 17:30:24

几年前,我遇到了相反的情况:问题只是在调试器没有附加时才出现。

结果,代码破坏了以前方法激活的堆栈帧,并使用调试器引入了中间堆栈帧。

你可能也有类似的情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4272939

复制
相关文章
Python 文件复制&按目录树结构拷贝&批量删除目录及其子目录下的文件
#!/usr/bin/env/ python # -*- coding:utf-8 -*- __author__ = 'shouke' import os import subprocess # 复制文件或目录到指定目录(非自身目录) def copy_dir_or_file(src, dest): if not os.path.exists(dest): print('目标路径:%s 不存在' % dest) return [False, '目标路径:%s 不存在' % dest] elif not os.path.isdir(dest): print('目标路径:%s 不为目录' % dest) return [False, '目标路径:%s 不为目录' % dest] elif src.replace('/', '\\').rstrip('\\') == dest.replace('/', '\\').rstrip('\\'): print('源路径和目标路径相同,无需复制') return [True,'源路径和目标路径相同,不需要复制'] if not os.path.exists(src): print('源路径:%s 不存在' % src) return [False, '源路径:%s 不存在' % src] # /E 复制目录和子目录,包括空的 /Y 无需确认,自动覆盖已有文件 args = 'xcopy /YE ' + os.path.normpath(src) + ' ' + os.path.normpath(dest) # 注意:xcopy不支持 d:/xxx,只支持 d:\xxxx,所以要转换 try: with subprocess.Popen(args, shell=True, universal_newlines = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc: output = proc.communicate() print('复制文件操作输出:%s' % str(output)) if not output[1]: print('复制目标文件|目录(%s) 到目标目录(%s)成功' % (src, dest)) return [True,'复制成功'] else: print('复制目标文件|目录(%s) 到目标目录(%s)失败:%s' % (src, dest, output[1])) return [False,'复制目标文件|目录(%s) 到目标目录(%s)失败:%s' % (src, dest, output[1])] except Exception as e: print('复制目标文件|目录(%s) 到目标目录(%s)失败 %s' % (src, dest, e)) return [False, '复制目标文件|目录(%s) 到目标目录(%s)失败 %s' % (src, dest, e)] # 删除指定目录及其子目录下的所有子文件,不删除目录 def delete_file(dirpath): if not os.path.exists(dirpath): print('要删除的目标路径:%s 不存在' % dirpath) return [False, '要删除的目标路径:%s 不存在' % dirpath] elif not os.path.isdir(dirpath): print('要删除的目标路径:%s 不为目录' % dirpath) return [False, '要删除的目标路径:%s 不为目录' % dirpath] # 注意:同xcopy命令,del也不支持 d:/xxxx,Linux/Unix路径的写法,只支持d:\xxx windows路径的写法 args = 'del /F/S/Q ' + os.path.normpath(dirpath) # /F 强制删除只读文件。 /S 删除所有子目录中的指定的文件。 /Q 安静模式。删除前,不要求确认 try: with subprocess.Popen(args, shell=True, universal_newlines = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc:
授客
2019/09/11
1.9K0
使用Python批量复制源目录下的所有Excel文件复制到目标目录中
前几天在Python白银群【由恒远】问了一个Python自动化办公处理的问题,这里拿出来给大家分享下。
Python进阶者
2023/09/02
5290
使用Python批量复制源目录下的所有Excel文件复制到目标目录中
编写一个程序,将 d: \ java 目录下的所有.java 文件复制到d: \ jad 目录下,并 将原来文件的扩展名从.java 改为.jad
自己写完之后,对照网上的代码进行了优化,涉及大量的文件操作,作为文件操作的摸版,可以借鉴里面的函数细节
粲然忧生
2022/08/02
1K0
java文件夹复制到指定目录
版权声明:本文为博主原创文章,未经博主允许不得转载。 最近一个项目需要文件夹复制 废话不说上代码 public class FileUtils { public static void copy(File orig, File dest) { // 用于改后缀后复制 BufferedReader buf = null; PrintWriter out = null; try { buf = new BufferedReader(new InputStrea
DencyCheng
2018/11/05
4.1K0
.gitignore过滤当前目录下的文件夹,不影响其他目录
最近在使用git时遇到一个问题, push到远程机器上时某个log文件夹丢失了,本地查找是有的,git status也显示clean:
梦飞
2022/06/23
1.3K0
msbuild 修改 VisualStudio 文件复制到输出目录的路径
在默认的 VisualStudio 可以右击任意的文件,让这个文件在编译时复制到输出目录,但是这个选项将会在复制到输出目录时带上这个文件所在 VisualStudio 的文件夹结构。本文告诉大家几个方法让 VisualStudio 的文件可以在编译时输出到自定义的任意路径
林德熙
2020/02/17
3.6K1
文件、目录_文件目录表
文件是一种抽象机制,它提供了一种方式用来存储信息以及在后面进行读取。可能任何一种机制最重要的特性就是管理对象的命名方式。
全栈程序员站长
2022/09/20
2.3K0
文件、目录_文件目录表
玩转并理解linux中的文件/目录的rwx权限
linux是一个相对安全的系统, 其中的权限更是无处不在。 在本文中, 我们来谈谈linux中的文件/目录的rwx权限。 为了简便起见, 我们仅仅以文件owner的rwx为例。
全栈程序员站长
2022/09/02
2.4K0
python 中目录、文件
2) open("test.txt",w)           直接打开一个文件,如果文件不存在则创建文件
py3study
2020/01/10
1.3K0
java 把文件从一个目录复制到另一个目录
方法一:简单粗暴,直接使用copy(),如果目标存在,先使用delete()删除,再复制;
崔笑颜
2020/06/08
1.9K0
PHP对目录下的子目录及文件进行压缩并解压
创建压缩类文件 zip.php <?php class Zip{ /** * Zip a folder (include itself). * Usage: * Zi
Action
2021/05/07
1.8K0
PHP对目录下的子目录及文件进行压缩并解压
Python 查看目录中的文件
一些关于文件的操作 例如,实现查看目录内容的功能。类似Linux下的tree命令。 统计目录下指定后缀文件的行数。
AnRFDev
2021/02/01
3.3K0
golang把文件复制到另一个目录
//本程序 主要功能是把A文件夹下的文件与B目录下文件对比,如果找到就覆盖到B相应的目录下。 // 用法: merge A目录 B目录 // merge.go package main import ( "flag" "fmt" "os" "path/filepath" "strings" "time" "github.com/Unknwon/com" ) const ( IsDirectory =
李海彬
2018/03/27
1.2K0
golang把文件复制到另一个目录
//本程序 主要功能是把A文件夹下的文件与B目录下文件对比,如果找到就覆盖到B相应的目录下。 // 用法: merge A目录 B目录 // merge.go package main import ( "flag" "fmt" "os" "path/filepath" "strings" "time" "github.com/Unknwon/com" ) const ( IsDirectory =
李海彬
2018/03/27
2.1K0
在 Linux 中永久并安全删除文件和目录的方法
引言 在大多数情况下,我们习惯于使用 Delete 键、垃圾箱或 rm 命令从我们的计算机中删除文件,但这不是永久安全地从硬盘中(或任何存储介质)删除文件的方法。 该文件只是对用户隐藏,它驻留在硬盘上的某个地方。它有可能被数据窃贼、执法取证或其它方式来恢复。 假设文件包含密级或机密内容,例如安全系统的用户名和密码,具有必要知识和技能的攻击者可以轻松地恢复删除文件的副本并访问这些用户凭证(你可以猜测到这种情况的后果)。 在本文中,我们将解释一些命令行工具,用于永久并安全地删除 Linux 中的文件。 1.
小小科
2018/05/04
4.6K0
在 Linux 中永久并安全删除文件和目录的方法
/etc/fstab文件_将etc目录挂载到
第一列到六列是设备或分区 挂载点 文件类型 default是挂载类型 dump 系统故障dump内存信息到硬盘 fsck 检查磁盘坏道等
全栈程序员站长
2022/09/20
8890
Nodejs中读取文件目录中的所有文件
关于Nodejs中的文件系统即File System可以参考官方Node.js v12.18.1的文档File system
ccf19881030
2020/06/28
14.8K0
linux下文件数、目录数、文件名长度的各种限制
以下测试都是在没有优化或修改内核的前提下测试的结果 1. 测试目的:ext3文件系统下filename最大字符长度   测试平台:RHEL5U3_x64   测试过程: LENTH=`for i in {1..255};do for x in a;do echo -n $x;done;done` touch $LENTH 当增加到256时,touch报错,File name too long linux系统下ext3文件系统内给文件/目录命名,最长只能支持127个中文字符,英文则可以支持255个字符 2. 测试目的:ext3文件系统下一级子目录的个数限制   测试平台:RHEL5U3_x64   测试过程: [root@fileserver maxdir]# for i in {1..32000};do mkdir $i;done mkdir: cannot create directory `31999': Too many links mkdir: cannot create directory `32000': Too many links ext3文件系统一级子目录的个数为31998(个)。 Linux为了cpu的搜索效率而规定的,要想改变数目大概要重新编译内核.  3. 测试目的:ext3文件系统下单个目录里的最大文件数   测试平台: RHEL5U3_x64   测试过程:   单个目录下的最大文件数似乎没什么特别限制,也是受限于所在文件系统的inode数限制:   df -i或者使用tune2fs -l /dev/sdaX或者dumpe2fs -h /dev/sdaX查看可用inode数,后两个命令    输出结果是一样的,但是跟df所得出的可用inode数会有些误差,至今不明白什么原因。   网上常用两种解决办法:   1) 重新mkfs,ext3默认block大小4096 Bytes,block设置小一些inode数设置大一些   2) 使用loopback文件系统临时解决:       在/usr中(也可以在别处)创建一个大文件,然后做成loopback文件系统,将原来的文件移到这个       文件系统中,并将它mount到/usr下合适的位置。这样可以大大减少你/usr中的文件数目。但是系统       性能会有点损失。 4. 测试目的: 打开文件数限制(文件句柄、文件描述符)   测试平台: RHEL5U3_x64   ulimit -n 65535设置,或者/etc/security/limit.conf里设置用户打开文件数、进程数、CPU等
一见
2019/03/14
5.5K0
java遍历文件夹下所有图片_遍历指定文件夹下的所有图片,并复制到指定目录下…
importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjavax.imageio.ImageIO;public classCopy
全栈程序员站长
2022/09/05
2.8K0
点击加载更多

相似问题

无法将cuda:0设备类型张量转换为numpy

16

cuda张量的索引列表给出错误-“无法将cuda:0设备类型张量转换为numpy”

12

将张量转换为numpy数组

10

将Numpy Arrray转换为张量

266

如何将张量的numpy数组转换为张量?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文