【问题标题】:Step debugging works fine but debugging without stepping causes strange error when using _tprintf步进调试工作正常,但使用 _tprintf 时不步进调试会导致奇怪的错误
【发布时间】:2012-12-29 10:30:51
【问题描述】:

好的,如果我不需要的话,我将保持这个简单并且不包括所有代码(目前)。我的内在感觉告诉我,这可能有一个简单的答案,而我像往常一样忽略了它。更有经验的人可能会说编译器是问题所在,但我从来不知道在 99.999% 的情况下,它在某种程度上一直是我的错误,所以......这就是问题所在。 我有一个程序,这个程序应该输出两个字符串,没什么花哨的

TCHAR* firststring = _T("FirstValue");
TCHAR* secondstring = _T("SecondValue");

_tprintf(_T("%s\n"),firststring);
_tprintf(_T("%s\n"),secondstring);

哪个输出..

firststring

在我的代码的特定部分,这不起作用(它在其他地方起作用)除非我是逐步调试...然后没关系...

firststring
secondstring

我什至尝试通过这样做将操作合二为一:

_tprintf(_T("%s\n[%s]\n"),firststring,secondstring);

我的结果是,第一个字符串,大括号在那里试图指出字符串试图被打印出来,如果它是空的,等等。我得到这个输出:

firststring
]

就是这样..再一次,除非跨步调试,否则一切都很好,花花公子:

firststring
[secondstring]

有人听说过这样的问题吗?我最后一次遇到像这样的奇怪问题是在 ASM 时代的段对齐,但我怀疑这里的情况,虽然我不确定 _tprintf 的内部工作原理......如果没有人,我会再试一次知道,我会假设它是因为前面的代码引起的错误。主要问题是,这是否出于任何简单的原因发生,或者这是否只是指出程序早期的问题,仅此而已。感谢您的回复。

PS:我意识到我没有提供足够的代码来完全回答问题,但问题是调试器中的这种行为是否存在已知的简单原因(运行与步进) .断点设置在函数级别,我使用的是 Visual Studio 2008。编译器版本如下:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 80x86
Microsoft (R) Macro Assembler Version 9.00.21022.08
Microsoft (R) Incremental Linker Version 9.00.21022.08
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Microsoft Browse Information Maintenance Utility Version 9.00.21022
Microsoft (R) Manifest Tool version 5.2.3790.2075

【问题讨论】:

  • 它真的输出“firststring”而不是“First Value”吗?无论如何,我的猜测是输出可以正常工作,但稍后会被其他内容覆盖。 (当您跳过第二个打印语句时,这还没有发生。)如果您将输出重定向到文件会发生什么?所有的字符串都在文件中吗?
  • 拥有一套完整的代码真的很有帮助。我觉得我们遗漏了一些东西,而我们遗漏的很可能是关键部分......你描述的不是我期望看到的,我想我已经看到了大部分可以去的东西编程错误...

标签: c++ visual-studio-2008 printf msvcrt crt


【解决方案1】:

我后来通过将这些字符串从 TCHAR* 更改为 const TCHAR* 解决了这个问题 当使用只读字符串时,用字符串文字编写字符串数组被认为是未定义的行为。我不确定是不是因为文档本身被存储为 unicode 或者,如果这甚至可以发挥作用,但我学会了不这样分配的艰难方法。如果我需要写入这些位置,我应该使用单独的常量字符串,并在我需要它在读/写缓冲区中时使用 strcpy 复制它的内容。显然不这样做会导致代码中出现安全漏洞和其他陷阱,即使它很简单。

(以下是我对部分代码的推理——如果有兴趣,请鼠标悬停)

至于代码示例不完整,这是一个非常大的项目,包含成千上万行代码,我几乎没想到这里有人会花这么多时间来完成所有工作。毕竟,这里的任何人都没有报酬这样做,我真的只需要找出是我还是这是否是常见的事情,如果是常见的事情,如何解决它。当我们在这里提出问题时,我们不仅在提出问题,而且还在就我们期望答案的范围提供指导,而且我们绝不会期望任何人像某些人看起来那样清晰建议。如果您不想回答问题或没有足够的信息让您这样做,那么就不要那么简单(这是因为我们没有一开始就要求的所有信息) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多