`po` gives `error: :1:1: error: use of unres

2019-01-18 01:11发布

I have this problem with po in the console where trying to output a function works in itself, but outputting a variable or constant doesn't.

first result is for <code>po bar.boy()</code>, second says <code>unresolved</code>

As you can see here, although you'd think the var/let holds the content of bar.boy(), Swift somehow can't find it...

6条回答
冷血范
2楼-- · 2019-01-18 01:37

Fixed after setting:

Optimization Level = None[-Onone] under Swift Compiler - Code Generation

Note that setting Optimization Level under Apple LLVM 8.0 - Code Generation has no effect

查看更多
3楼-- · 2019-01-18 01:38

So it turns out there was probably a bug in the past that when you were adding a Swift file it would add/ask a Bridging header, but it wouldn't add that line to your project

SWIFT_OPTIMIZATION_LEVEL = "-Onone";

which means you'd stay in this state

SWIFT_OPTIMIZATION_LEVEL fastest

resulting in error: <EXPR>:1:1: error: use of unresolved identifier!

I could only find that out because I moved around files in my project and when I added ObjC files to the project, it asked me about a Bridging header (although I had one already!) and luckily added that SWIFT_OPTIMIZATION_LEVEL. One could consider this is a bug to consider the default value is fastest, but then again I guess this was only a bug in the past and got fixed now.

Still, I fixed now it might be a bug the other way around, if it add none in the release build. I can't test this right now because for testing this I only had a Debug build. I'll leave that as an exercise :) for Apple's Engineers.

查看更多
狗以群分
4楼-- · 2019-01-18 01:41

If your project is using Swift, there are two separate "Optimization Level" settings in the project/target configuration. Its not only "SWIFT_OPTIMIZATION_LEVEL". Check this link: https://stackoverflow.com/a/32984193/2060180

I'll leave it here in case it's useful to someone.

查看更多
你好瞎i
5楼-- · 2019-01-18 01:45

I bet that bug is due to the fact that foo has been optimized out during compilation and it's symbol does not exist anymore in the compiled code (even if it shouldn't have in debug and it's still an LLDB bug)

Probably if you add some usage of foo in the next lines (even a println) its symbol will hopefully be kept in the IR and you'll be able to po foo

(I agree that that's still a bug but at least if it works you'll have a workaround and some sense of explanation)

查看更多
女痞
6楼-- · 2019-01-18 01:52

I set Swift Complier to "-O"

SWIFT_OPTIMIZATION_LEVEL = "-O";

and set it back to "-Onone".

SWIFT_OPTIMIZATION_LEVEL = "-Onone";

Then it works.

查看更多
等我变得足够好
7楼-- · 2019-01-18 01:55

I encountered a similar issue but I already had the correct configuration, all optimisations set to None. However I still didn't get any values.

After some further digging I found out that the issue originated from Xcode being unable to the resolve the types:

(lldb) frame variable self
<could not resolve type>

That led me to this question: xcode 8 Debugger 'Could not resolve type' where the issue is described and the bridging header seems to cause issues.

With my project not having any bridging headers I studied the build settings once more and found this setting

setting[1]

This was initally set to YES. After changing the it to NO symbols are working again.

SWIFT_INSTALL_OBJC_HEADER = NO

查看更多
登录 后发表回答