用于 vs 代码的 Sphere SDK 中的不可见和锁定断点

Invisible and locked Breakpoint in Sphere SDK for vs code

我正在尝试开始 Microsoft 的 azure sphere 开发。

当我尝试调试 vs 代码中的任何 starter projects 时,它告诉我我在应用程序的第一行设置了一个断点。 但是,vs code 不会在 "Breakpoints" 选项卡中显示任何断点。

我是 运行 最新的 VS 代码版本 (1.44),在 windows 10 上使用 Azure Sphere Extension 20.1。同样的问题出现在 Linux。

要重现错误:

  1. 从 github 下载 starter projects
  2. 为 visual studio 代码安装 Azure sphere 扩展。
  3. 在 visual studio 代码中打开 azure-sphere-samples\Samples\HelloWorld\HelloWorld_HighLevelApp 中的 HelloWorld_HighLevelApp 文件夹。
  4. 转到“调试”选项卡并点击左上角的绿色播放按钮。在按钮旁边应该显示 Launch for Azure Sphere High-Level Applications (gdb)

对我来说这不是错误,但输出控制台显示:

Deploying image...
Starting debugger....

Process /mnt/apps/1689d8b2-c835-2e27-27ad-e894d6d15fa9/bin/app created; pid = 2233
Listening on port 2345

Remote debugging from host 192.168.35.1, port 54911

Starting CMake Hello World application...

调试控制台显示:

...
Breakpoint 1, main () at ../../main.c:45
45  {
Loaded 'target:/usr/lib/libapplibs.so.0'. Symbols loaded.
Loaded 'target:/lib/libgcc_s.so.1'. Symbols loaded.
Loaded 'target:/usr/lib/libc++runtime.so.1'. Symbols loaded.

是否有解决此问题的变通办法/计划?

加法 1: 为了提供额外的说明,这里提供了一个屏幕截图,显示了控制台输出(设置断点)和 ui(未设置断点)的未匹配项

Azure Sphere 使用 gdbserver 为设备提供调试通道。 gdb 的默认行为是在进入 main 时中断。这可能会让 Windows 上的人感到困惑,他们希望 运行 断点行为在 Visual Studio 中很常见。对于我们与 GDB 的接口,我们故意在 Visual Studio 中输入 main 时跳过断点以保持一致。您实际上可以在调试日志输出 window.

中看到跳过的断点

对于 VS Code,我们还会在您打开 Windows 时跳过 main 上的断点。从上面的输出来看,您似乎在 Linux 上。我已经有几个星期没有在 Linux 上使用它了,所以不记得那里的行为是否有意不同。在 Linux 时中断进入 main 对我来说是有意义的,因为这是使用 GDB 时的普遍期望,而 GDB 在 Windows 上更常见。我会检查这是否是设计使然并回复,但我怀疑是。

解决方案:

终于找到问题的根源了。 Visual studio 与纯 C 代码相比,调试球体设备时代码的行为略有不同。

当您启动调试模式并且最初没有设置断点时,它不会启动 运行 您的程序,直到您设置了断点。在普通的 c 调试中,程序只是运行,打印的值显示在调试控制台中。