AudioStreamBasicDescription赋值异常:LLDB显示nil但变量检查器非空
解决LLDB调试中
po dataFormat显示nil但变量检查器有值的问题 这是LLDB调试Core Audio结构体时常见的小坑,别担心,不是你的代码出问题了,是调试工具的显示逻辑在处理Optional结构体时有点“小迷糊”。
问题原因
你定义的dataFormat是Optional<AudioStreamBasicDescription>类型,而AudioStreamBasicDescription是一个值类型结构体。当通过AudioFileGetProperty的指针参数给它赋值后,LLDB的po命令有时候无法正确识别Optional已经被填充了具体的结构体值,导致误显示为nil;但变量检查器是直接读取内存状态,所以能正确显示some包含的内容。
调试解决方案
试试下面几种方法来正确查看dataFormat的内容:
强制解包后打印:既然变量检查器已经显示它非nil,可以直接用强制解包来打印完整结构体:
po dataFormat!使用
p命令替代po:p命令会直接打印变量的原始内存结构,对值类型的支持更准确:p dataFormat直接访问结构体字段:如果你只想看某个具体属性(比如采样率),可以直接访问:
po dataFormat?.mSampleRate用
frame variable命令查看:LLDB的frame variable(缩写fr v)会更精准地展示当前栈帧的变量状态,完全不会有po的显示问题:fr v dataFormat
代码验证
你的代码本身是没问题的:
var dataFormat: AudioStreamBasicDescription? var propSize: UInt32 = UInt32(MemoryLayout<AudioStreamBasicDescription>.size) try SCoreAudioError.check(status: AudioFileGetProperty(audioFileID!, kAudioFilePropertyDataFormat, &propSize, &dataFormat), "Couldn't get file's data format")
AudioFileGetProperty已经成功给dataFormat赋值了,只是LLDB的po命令在处理Optional结构体时出现了显示偏差而已。
内容的提问来源于stack exchange,提问作者Moises Lozada
相关产品推荐
相关产品推荐

