【问题标题】:does vscode inline breakpoint support C&C++ languange?vscode 内联断点是否支持 C C++ 语言?
【发布时间】:2021-08-16 06:24:02
【问题描述】:

#include <stdio.h>

int main() {
    for (/*1*/ int i = 0; /*2*/i < 10 ; /*3*/i++) { /*4*/printf("hello\n");}
    return 0;
}

似乎 vscode 无法在断点处停止(在 cmets 中)

【问题讨论】:

  • 我认为调试器通常不支持这一点。和 tbh,我也不是很明白这一点。
  • 在代码块中添加了一个断点以更好地对应图像
  • @klutt,这是 youtube 上的一个演示,适用于 js。 youtube.com/watch?v=HzYKDfTMCtg
  • @tarikjhin 如果它是另一种语言。在 gcc C 中这几乎是不可能的,因为调试信息不​​包含内部循环信息。所以不可能使用 gcc/gdb。其他编译器可能会添加此信息(我相信 ms one 会这样做)

标签: c breakpoints vscode-debugger


【解决方案1】:

我不确定这是否是普遍支持的功能。 TBH,如果您需要它,我会说这是一种代码味道。您的示例很简单,无需知道 2 和 3 之间发生了什么。而且当您确实需要它时,for 标头中的条件和语句可能太复杂了。

此外,大多数断点。可以很容易地移动到相同的位置。

/*1*/
/*2*/ First time
for (/*1*/ int i = 0; /*2*/i < 10 ; /*3*/i++) 
{ 
    /*4*/ printf("hello\n");
    /*2*/ Second time and later
}

但是如果不重写代码,就不可能在 2 和 3 之间放置一个中断。

如果你真的想要这个并且你的调试器不支持它,你可以用下面的方式重写它。改变这个:

for (<init>;<cond>;<inc>) 
{ 
    // Loop body
}

到这里:

/*1*/
for (<init>;;) 
{ 
    /*2*/ if(!(<cond>)) break;

    /*4*/ // Loop body

    /*3*/ <inc>;
}

来自 cmets:

谢谢,我知道描述中的 sn-ps 帖子的编码风格不好,这个问题背后的主要原因是我无法格式化现有代码,我需要调试这段编码风格不好的代码...

我完全理解您的问题,但在调试之前,尝试在开始调试之前将代码重构为可调试代码通常是一个非常好的建议。

与 JS 比较

您提到您可以在 javascript 中执行此操作。这里要记住的一件好事是 javascript 是一种解释型语言,而 C 和 C++ 是编译型语言。编译后的代码不一定与源代码有很好的一一对应。调试器会尽力做好映射,但可能会失败。尤其是在激活大量优化的情况下。

【讨论】:

  • 谢谢,我知道描述中的 sn-ps 帖子的编码风格不好,这个问题背后的主要原因是我无法格式化现有代码,我需要调试这段代码不好的代码风格...
  • @tarikjhin 顺便说一句。如果您不允许格式化现有代码,您应该如何调试它?您必须修改代码才能修复错误。
  • 我同意你关于编译语言和解释语言之间区别的观点,对js的内联断点的支持可能取决于动态语言的解释特性,有待确认。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2011-02-25
相关资源
最近更新 更多