我从各种来源(虽然大多数来自我的同事)中听到过,-O3用g ++ 的优化级别进行编译在某种程度上是"危险的",并且除非被证明是必要的,否则应该避免.
这是真的,如果是的话,为什么?我应该坚持-O2吗?
如果抛出异常,我想有办法向用户报告堆栈跟踪.做这个的最好方式是什么?是否需要大量的额外代码?
回答问题:
如果可能的话,我希望它是便携式的.我想要弹出信息,因此用户可以复制堆栈跟踪并在出现错误时通过电子邮件发送给我.
我在Visual Studio 2008下调试一个(本机)多线程C++应用程序.在看似随机的场合,我得到一个"Windows触发了一个断点......"错误,并注意到这可能是由于堆.这些错误并不会立即使应用程序崩溃,尽管它很可能会在之后崩溃.
这些错误的一个大问题是它们只在实际发生损坏后弹出,这使得它们很难跟踪和调试,尤其是在多线程应用程序上.
什么样的事情会导致这些错误?
我该如何调试它们?
提示,工具,方法,启发......欢迎.
我有一个Visual Studio 2005 C++程序,它在Release模式下的运行方式与在Debug模式下的运行方式不同.在发布模式下,发生(明显的)间歇性崩溃.在调试模式下,它不会崩溃.Release构建与Debug构建不同的原因是什么?
值得一提的是,我的程序相当复杂,并使用多个第三方库进行XML处理,消息代理等...
提前致谢!
我无法通过更改系统设置来创建我的流程的minidump.所以我的问题是:
当系统崩溃时,系统是否会为用户进程创建一个minidump
如果是,我需要配置哪个设置
或者我必须以编程方式创建minidump.
在调查崩溃时小型泵的效果如何
我使用的是Windows XP,C++,VC6
不久前,我遇到了一个问题,要求我将WinDbg.exe设置为默认的事后调试器.现在我已经解决了这个问题并且恢复正常工作,如果我能将VS设置为默认的事后调试器,那将是非常好的.怎么去做这个?
另外,如何将VS附加到现有会话?也就是说,我已经在一个窗口中打开了我的VS项目,并且在我启动程序的地方打开了一个命令行.如果程序崩溃,我如何让VS弄清楚将调试器连接到已经打开的项目中的活动行?
请帮忙!我真的很有智慧.我的程序是一个小的个人笔记管理器(google为"cintanotes").在某些计算机上(当然我没有它们),它在启动后就会出现未处理的异常.除了他们倾向于拥有AMD CPU之外,没有任何关于这些计算机的特别之处.
环境:Windows XP,Visual C++ 2005/2008,原始WinApi.
以下是"Heisenbug"的确定内容:
1)崩溃只发生在Release版本中.
2)一旦删除所有与GDI相关的东西,崩溃就会消失.
3)BoundChecker没有抱怨.
4)编写日志表明崩溃发生在本地int变量的声明中!怎么会这样?内存腐败?
任何想法将不胜感激!
更新:我设法在"有故障"的PC上调试应用程序.结果:
"CintaNotes.exe中0x0044a26a处的未处理异常:0xC000001D:非法指令."
和代码中断
0044A26A cvtsi2sd xmm1,dword ptr [esp + 14h]
所以似乎问题出现在"代码生成/启用增强指令集"编译器选项中.它设置为"/ arch:SSE2"并且在不支持SSE2的计算机上崩溃.我已将此选项设置为"未设置",并且错误消失了.唷!
非常感谢大家的帮助!!
我有一个小的单线程C++应用程序,使用Visual Studio 2005编译和链接,使用boost(crc,program_options和tokenizer),一小部分STL和各种其他系统头文件.
(它的主要目的是读取.csv并生成自定义二进制.dat和配对的.h声明结构,"解释".dat的格式.)
在调试器外部运行时,该工具正在崩溃(对NULL的访问冲突),仅在发布时.例如,按F5不会导致工具崩溃,Ctrl-F5会崩溃.当我重新连接调试器时,我得到这个堆栈:
ntdll.dll!_RtlAllocateHeap@12() + 0x26916 bytes
csv2bin.exe!malloc(unsigned int size=0x00000014) Line 163 + 0x63 bytes C
csv2bin.exe!operator new(unsigned int size=0x00000014) Line 59 + 0x8 bytes C++
>csv2bin.exe!Record::addField(const char * string=0x0034aac8) Line 62 + 0x7 bytes C++
csv2bin.exe!main(int argc=0x00000007, char * * argv=0x00343998) Line 253 C++
csv2bin.exe!__tmainCRTStartup() Line 327 + 0x12 bytes C
Run Code Online (Sandbox Code Playgroud)
它崩溃的线是一个看似无害的分配:
pField = new NumberField(this, static_cast<NumberFieldInfo*>(pFieldInfo));
Run Code Online (Sandbox Code Playgroud)
...我不相信它已经到达了构造函数,它只是在跳转到构造函数之前分配内存.它在崩溃时也会执行此代码几十次,通常是在一致(但不是非可疑)的位置.
使用/ MTd或/ MDd(调试运行时)进行编译时问题就消失了,使用/ MT或/ MD时会回来.
NULL从堆栈加载,我可以在内存视图中看到它._RtlAllocateHeap @ 12 + 0x26916字节似乎是一个巨大的偏移,就像一个不正确的跳转一样.
我已经尝试_HAS_ITERATOR_DEBUGGING过调试版本,并没有带来任何可疑的东西.
在Record :: addField的开头和结尾删除HeapValidate会在崩溃时显示一个OK堆.
这曾经工作 …
我正在使用第三方专有DLL,我无法获得源代码.但是,使用SWIG 1.3.39自动生成的包装代码可供我使用.包装器代码包含一个C++文件,该文件编译(使用一些描述DLL的头文件)到DLL和一个C#项目,它使PInvoke调用C++包装器DLL.
根据我对供应商文档的解释,我已将解决方案中的所有内容编译为x86或x64,具体取决于目标平台.供应商提供专有DLL的32位和64位版本,并且我确保我使用正确的版本给定构建.我的机器是32位的.在我的机器上,在发布版本或调试版本中测试我的应用程序的x86版本似乎工作正常.但是,在64位上,应用程序在调试模式下工作,但在发布模式下因System.AccessViolationException而失败.
我已经阅读了这篇很好的博客文章,似乎很好地描述了调试与发布问题,以及引发博客文章的这个问题和答案.但是,我不确定如何在这种情况下解决问题.
AccessViolationException似乎是在第一次从C++包装器返回(或尝试返回)任何实际长度的字符串时发生的.这是违规的C#代码:
// In one file of the C# wrapper:
public string GetKey()
{
// swigCPtr is a HandleRef to an object already created
string ret = csWrapperPINVOKE.mdMUHybrid_GetKey(swigCPtr);
return ret;
}
// In the csWrapperPINVOKE class in another file in the C# wrapper:
[DllImport("csWrapper.dll", EntryPoint="CSharp_mdMUHybrid_GetKey")]
public static extern StringBuilder mdMUHybrid_GetKey(HandleRef jarg1);
Run Code Online (Sandbox Code Playgroud)
来自C++包装器的麻烦的C++代码:
SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) {
char * jresult ;
mdMUHybrid *arg1 = (mdMUHybrid *) 0 ; …Run Code Online (Sandbox Code Playgroud) 我在今天的一次采访中被问到列出调试和发布版本之间可能出现的四个差异.我认为它们意味着行为的差异,而不是诸如调试信息和诸如此类的差异.我只能说出两个名字:
我可以命名的其他差异是什么?
我的ASP.NET应用程序有问题.它已经开发了大约一年左右而没有禁用调试模式.我想测试它是否在没有调试的情况下工作,但它不是,但是,当我设置debug ="true"时,它工作正常.
当我第一次尝试打开应用程序时,它会给我"服务器不可用"错误.在事件日志中,我有两个错误:
我的IIS版本是在Windows XP上运行的5.1.
我会很感激任何建议.
更新:调试模式的更改在web.config中进行
当我使用配置设置为release(对于x86和x64)进行编译时,我的程序无法完成.为了澄清,没有构建错误或执行错误.
在寻找问题的原因和解决方案之后,我发现程序只会崩溃作为发布版本 - 如何调试?这提出它是一个数组问题.虽然这解决了我的问题,但它给了我一些关于此事的见解(我将这里留给下一个人).
为了进一步混淆,只有当主线程上的子程序的执行时间大于约0ms时才会出现问题.
以下是相关的代码部分:
// Startup Progress Bar Thread
nPC_Current = 0; // global int
nPC_Max = nPC; // global int (max value nPC_Current will reach)
DWORD myThreadID;
HANDLE progressBarHandle = CreateThread(0, 0, printProgress, &nPC_Current, 0, &myThreadID);
/* Do stuff and time how long it takes (this is what increments nPC_Current) */
// Wait for Progress Bar Thread to Terminate
WaitForSingleObject(progressBarHandle, INFINITE);
Run Code Online (Sandbox Code Playgroud)
我的程序卡在上面的违规行是最后一个语句,程序等待创建的线程终止:
WaitForSingleObject(progressBarHandle, INFINITE);
Run Code Online (Sandbox Code Playgroud)
以下是进度条功能的代码:
DWORD WINAPI printProgress(LPVOID lpParameter)
{
int lastProgressPercent = -1; // …Run Code Online (Sandbox Code Playgroud)