繁体   English   中英

尝试打印矢量时lldb断言失败

[英]lldb assertion failure when attempting to print vector

我得到错误

lldb:/home/hannes/.llvm/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp:2271:uint64_t :: RecordLayoutBuilder :: updateExternalFieldOffset(const clang :: FieldDecl *,uint64_t):声明`ExternalFieldOffsets.find( Field)!= ExternalFieldOffsets.end()&&“字段没有外部偏移”失败。 中止(核心已弃用)

当我尝试打印vector<string> 有谁知道为什么会这样,以及如何解决? 等效项在gdb中也能很好地工作(有很多原因使我宁愿使用/ 必须在gdb上使用lldb)。

我正在使用llvm,clang和lldb主干运行Ubuntu 12.10。

该程序,构建说明和lldb命令序列:

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

using std::for_each;
using std::begin;
using std::end;

int main() {
    std::vector<std::string> vec{"Hello","World","!"};
    for_each(begin(vec),end(vec),[](const std::string& s) {
    std::cout << s << " ";
      });
    std::cout << std::endl;
    return 0;
}

clang++ -g -c -std=c++11 main.cpp
clang++ -std=c++11 main.o -o test

lldb test 
Current executable set to 'test' (x86_64).
(lldb) break -n main
invalid command 'breakpoint -n'
(lldb) breat set -n main
error: 'breat' is not a valid command.
(lldb) break set -n main
Breakpoint 1: where = test`main + 26 at main.cpp:5, address = 0x0000000000400aea
(lldb) run
Process 24489 launched: '/home/hannes/Documents/Programming/CXX/test/test' (x86_64)
Process 24489 stopped
* thread #1: tid = 0x5fa9, 0x0000000000400aea test`main + 26 at main.cpp:5, stop reason = breakpoint 1.1
    frame #0: 0x0000000000400aea test`main + 26 at main.cpp:5
   2    #include <string>
   3    
   4    int main() {
-> 5        std::vector<std::string> vec{"Hello","World","!"};
   6        return 0;
   7    }
n
Process 24489 stopped
* thread #1: tid = 0x5fa9, 0x0000000000400c72 test`main + 418 at main.cpp:6, stop reason = step over
    frame #0: 0x0000000000400c72 test`main + 418 at main.cpp:6
   3    
   4    int main() {
   5        std::vector<std::string> vec{"Hello","World","!"};
-> 6        return 0;
   7    }
frame variable
lldb: /home/hannes/.llvm/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp:2271: uint64_t <anonymous namespace>::RecordLayoutBuilder::updateExternalFieldOffset(const clang::FieldDecl *, uint64_t): Assertion `ExternalFieldOffsets.find(Field) != ExternalFieldOffsets.end() && "Field does not have an external offset"' failed.
Aborted (core dumped)

日志输出的调试级别为10:

Logging from function (<frame object at 0x3172f20>, '/usr/lib/python2.7/dist-packages/lldb/formatters/cpp/gnu_libstdcpp.py', 141, '__init__', ['\t\tlogger = lldb.formatters.Logger.Logger()\n'], 0)
Providing synthetic children for a map named vec
Logging from function (<frame object at 0x3170d10>, '/usr/lib/python2.7/dist-packages/lldb/formatters/cpp/gnu_libstdcpp.py', 214, 'update', ['\t\tlogger = lldb.formatters.Logger.Logger()\n'], 0)

如果您说框架变量--raw会发生同样的事情吗? 此命令旨在转储矢量禁用数据格式化程序。 在特定情况下,您将获得(假设不崩溃)矢量的内存布局,而不是打印存储在其中的字符串。 我主要是想弄清楚数据格式化程序是否是此问题的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM