Gui*_*vel 5 c windows clang lldb
在我的 Windows 10 计算机上设置 clang 时,我无法让调试器正常工作。编译似乎工作正常,至少对于我尝试过的简单的“hello,world”程序来说是这样。但是,当我尝试在此测试程序(或我尝试过的任何其他程序)上运行 lldb 或 gdb 调试器时,它无法识别函数名称。
这是我的C程序代码:
#include <stdio.h>
int main(void) {
puts("Hello, world!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道这里没什么特别的。我正在使用以下命令进行编译:
> clang -g -O0 hello.c -o hello.exe
Run Code Online (Sandbox Code Playgroud)
然后我尝试运行调试器:
> lldb hello
(lldb) target create "hello"
Current executable set to 'hello' (x86_64).
(lldb) b main
Breakpoint 1: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb) r
Process 12156 launched: 'C:\Users\********\Projects\clang-test\hello.exe' (x86_64)
Process 12156 exited with status = 0 (0x00000000)
(lldb)
Run Code Online (Sandbox Code Playgroud)
显然,符号“main”未被识别,并且程序没有在“main”函数开始时停止,而是运行到完成(在不同的控制台窗口中,因此这里没有程序输出)。
如何让调试符号发挥作用?在另一个 stackoverflow 答案中,我发现添加编译器选项“-g -O0”应该可以解决问题,但正如你所看到的,这并不能解决我的问题。我还发现了一个关于如何设置调试的不同 stackoverflow 答案,如果代码与可执行文件不在同一目录中,但这与我的情况无关:当前工作目录与包含代码和可执行文件的目录相同在他们中。
部分版本信息:
> clang --version
clang version 9.0.0 (tags/RELEASE_900/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
> lldb --version
lldb version 9.0.0
Run Code Online (Sandbox Code Playgroud)
小智 4
您提供的“-g -O0”选项确实应该让调试器知道它需要从可执行文件中获得的所有符号。
因此,我怀疑问题出在其他地方,可能是你的终端,或者你的 LLDB 版本/实现。
您使用的是 Windows cmd.exe 命令行吗?或者其他东西,比如 Powershell ?我从来没有设法让调试器在这些环境中正常工作,但是使用Cygwin更容易,它是 Windows 的 bash shell(它在其安装文件夹中创建一个“模拟”linux 环境,因此您拥有所有 /usr 、/bin、/etc bash shell 需要的文件夹)这样您就可以gdb像在 UNIX 系统上那样实际使用。
如果上述方法听起来更麻烦而不是节省时间,那么我会推荐另一个调试器,例如 Visual Studio 调试器。事实上,也许像Dr.Memory这样的内存分析工具可以满足您的需求