我应该在OSX上使用C,Make和lldb进行基本活动,这似乎不符合文档中的指定。学习“lldb”调试器的简单C编码练习,是“学习C艰难之路”(Shaw,Zed A.,2015)的练习-4,所以这是一个陈旧,没有复杂性的例子,说明这应该如何工作。只有OSX的行为与其Man和Help页面所说的不同。
Makefile中是否存在根本缺失的内容?文档是否给我错误的语法?这个版本的OSX或编译器或lldb是否有错误?你能不能在OSX上的C中的main()方法上设置断点,所以这个练习基本上是有缺陷的,并且两年内没有人注意到它?
感谢您花时间仔细研究......
以下是整个用例输出:
My-MacBook-Pro:Exercises Me$ ls -als total 48
0 drwxr-xr-x 7 Me staff 238 Mar 12 20:56 .
0 drwxr-xr-x 8 Me staff 272 Feb 26 02:11 ..
24 -rw-r--r--@ 1 Me staff 10244 Mar 12 20:56 .DS_Store
0 drwxr-xr-x 5 Me staff 170 Mar 3 02:48 BonusContent
8 -rw-r--r--@ 1 Me staff 48 Mar 12 20:56 Makefile
8 -rw-r--r--@ 1 Me staff 322 Feb 28 00:50 ex1.c
8 -rw-r--r-- 1 v staff 184 Mar 12 19:53 ex3.c
My-MacBook-Pro:Exercises Me$ cat ex3.c
#include <stdio.h>
int main(int argc, char *argv[])
{
int age = 10;
int height = 72;
printf(" I am %d years old.\n", age);
printf(" I am %d inches tall.\n", height);
return 0;
}
My-MacBook-Pro:Exercises Me$ cat Makefile
CFLAGS=-Wall -g
all: ex3
clean:
rm -f ex3
My-MacBook-Pro:Exercises Me$ make ex3
cc -Wall -g ex3.c -o ex3
My-MacBook-Pro:Exercises Me$
My-MacBook-Pro:Exercises Me$ lldb ex3
(lldb) target create "ex3"
Current executable set to 'ex3' (x86_64).
(lldb) breakpoint set --method main
Breakpoint 1: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb)
My-MacBook-Pro:Exercises Me$ ls -als
total 72
0 drwxr-xr-x 9 Me staff 306 Mar 12 20:57 .
0 drwxr-xr-x 8 Me staff 272 Feb 26 02:11 ..
24 -rw-r--r--@ 1 Me staff 10244 Mar 12 20:57 .DS_Store
0 drwxr-xr-x 5 Me staff 170 Mar 3 02:48 BonusContent
8 -rw-r--r--@ 1 Me staff 48 Mar 12 20:56 Makefile
8 -rw-r--r--@ 1 Me staff 322 Feb 28 00:50 ex1.c
24 -rwxr-xr-x 1 Me staff 8712 Mar 12 20:57 ex3
8 -rw-r--r-- 1 Me staff 184 Mar 12 19:53 ex3.c
0 drwxr-xr-x 3 Me staff 102 Mar 12 20:57 ex3.dSYM
My-MacBook-Pro:Exercises Me$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.11.6
BuildVersion: 15G1217
My-MacBook-Pro:Exercises Me$
My-MacBook-Pro:Exercises Me$ clang --version -g
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
My-MacBook-Pro:Exercises Me$
My-MacBook-Pro:Exercises Me$ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0
My-MacBook-Pro:Exercises Me$
My-MacBook-Pro:Exercises Me$ lldb --version
lldb-360.1.70
回应“奥拉夫”: MDN
(lldb) breakpoint set --name main
(lldb) br s -n main
(lldb) b main
在旧版本的OSX上还有一个其他线程在2015年有类似的错误消息,但它的“解决方案”不起作用,并且确实通过不使用Make来忽略该问题。
我想尝试避免使用“为什么不使用C,尝试使用其他语言”或“我更喜欢使用不同的调试器”这样的正交或复杂“建议”,所以请使用此一个“......那些人不会回答这个问题:”
答案 0 :(得分:1)
b
命令和breakpoint set
命令完全不同。 b
是一个DWIM类型命令,它尽可能地尝试模拟gdb断点解析器的语法。它最终使用适当的断点类型发送到break set
。
breakpoint set -n foo
创建一个通用的“符号名称匹配”断点。因此,例如,它将匹配一个名为“foo”的函数或一个ObjC选择器“foo”或一个名为“foo”的C ++方法...... b foo
调度到breakpoint set -n foo
。
但有时您知道您只想在类方法(C ++或Swift)上设置断点,在这种情况下,您可以使用--method
选项来适当地限制搜索。同上ObjC选择器和--selector
选项。
在您的情况下,--name
工作但--method
不正确。你的主要是纯粹的C函数,而不是类方法。
BTW,b
实际上是lldb“正则表达式命令”,见
(lldb) help command regex
了解更多详情。您可以通过以下方式启用回显正则表达式命令解析来查看命令实际执行的操作:
(lldb) set set interpreter.expand-regex-aliases 1
然后尝试一些断点:
(lldb) b main
breakpoint set --name 'main'
(lldb) b foo.c:11
breakpoint set --file 'foo.c' --line 11
等...
答案 1 :(得分:0)
从一个人尝试重现这些条件,一个有价值的观察结果是,在他的安装中,他可以按照规定同义地使命令工作是有帮助的,并间接地提供了解决方案。
我卸载了整个XCode模块和我拥有的其他支持C开发模块,并重新安装了新的下载。在那之后,我有了他观察到的相同功能。
因此问题出现在我特定MacBook上的二进制安装中,可能是由于更新未在某处正确应用,这不是一般问题。