debugging 为什么有些程序在使用调试器时工作,但在运行正常调试执行时却不工作?

zi8p0yeb  于 2023-10-24  发布在  其他
关注(0)|答案(4)|浏览(212)

我有几次在使用Visual Studio编写程序时,在沿着的某个地方出现了断点。自然地,我的第一个想法是在程序的早期设置一个断点,然后慢慢地逐行执行代码,直到我到达错误。
但是很多时候,当我在调试器中慢慢地单步调试代码时,我发现一切都正常工作。然而,当我只是试图在没有断点的情况下运行程序时,就会出现问题。
为什么会发生这种情况?逐行单步执行代码实际上与在dubug模式下运行程序不同吗?

  • (我不是在谈论调试与发布,我是在谈论调试与逐行调试)*
fykwrbwg

fykwrbwg1#

原因之一可能是多个执行线程之间存在计时问题,当程序“全速”运行时和在调试器中暂停线程时,这些问题的发生方式不同。

vojdkbi0

vojdkbi02#

这可能是由于一些线程不安全的操作,这些操作在单步执行代码时似乎正确发生,但在运行时却不正确。排除了更复杂的优化,因为您确信正在运行调试版本。

snvhrwxg

snvhrwxg3#

在调试器内部运行实质上改变了运行时选项,例如堆操作,以便可以检测错误并向用户显示。
请参见here
当进程在任何调试器下运行时,将自动为进程中的所有堆启用某些堆调试选项。
这不一定是你的问题,但可能是一个候选人。

dtcbnfnu

dtcbnfnu4#

在我的例子中,我使用一个本地.env文件将环境变量摄取到python脚本中,以便在vscode上进行本地测试。当我运行代码时,代码在调试模式下执行而没有错误。
其背后的原因是,默认情况下vscode在调试模式下从.env文件中获取环境变量,而不是在运行脚本时,因此您必须通过直接导出~/.bashrc~/.zshrc文件中的变量或通过使用load_dotenv使用以下片段来导出环境变量以正常运行:

from dotenv import load_dotenv

load_dotenv()

这将在项目目录中查找.env文件,并在运行时设置环境变量。

相关问题