c++ - 在 Eclipse C++ 中启用漂亮的打印
问题描述
我正在尝试在 Eclipse 中为 STL 启用漂亮的打印。这些是我的版本:
- Eclipse 版本:2018-09 (4.9.0)
- gdb 7.11.1
- 许邦图 16.04
- gcc 7.4.0
- g++ 7.4.0
我已经阅读了各种指南,这就是我所做的(我从其他 SO qns 复制了答案):
第 1 步:下载漂亮的打印机:
$ cd /home/ali/Downloads
$ svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
第 2 步:编辑 gdbinit
$ subl /home/ali/.gdbinit
将以下内容粘贴到 .gdbinit 中:
python
import sys
sys.path.insert(0, '/home/ali/Downloads/python/')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
我也试过gcc自带的那个,就是:
sys.path.insert(0, '/usr/bin/gcc-8/python')
此外,我已将这些行添加到 printers.py:
if length > 100: length = 100
第 3 步:设置 Eclipse
在 Eclipse 的 GDB 设置中(Window->Preferences->C/C++->Debug->GDB),将 GDB 命令文件路径设置为刚刚创建的 .gdbinit 文件。此外,在同一选项卡中,选中漂亮打印框。
对于任何需要漂亮打印的现有调试配置(运行->调试配置),选择调试配置,然后在调试器选项卡上设置 GDB 命令文件路径。
第 4 步:测试 GDB
您可以按如下方式验证 GDB 是否打印良好(完成前面过程的前两个步骤后):
将以下代码保存在名为 test.cpp 的文件中:
#include <map>
int main() {
std::map<char, int> first;
first['a'] = 10;
first['b'] = 20;
}
用 g++ 编译:
$ g++ -g -o test test.cpp
运行 gdb:
$ gdb test
设置断点:
(gdb) b test.cpp:5
这将输出:
Breakpoint 1 at 0x40093f: file src/test.cpp, line 5.
运行程序:
(gdb) run
Starting program: /path/to/test
当断点被击中时,将显示 gdb 提示符。使用以下命令打印地图:
(gdb) p first
如果一切顺利,您应该会看到以下输出:
$1 = std::map with 1 elements = {[97 'a'] = 10}
我仍然没有在 Eclipse 中得到漂亮的打印(在终端中使用 gdb 可以正常工作):
seq_of_probs = {<No data fields>}}
Default:{...}
Decimal:{...}
Hex:{...}
Binary:{...}
Octal:{...}
其中 seq_of_probs 是类型std::vector<std::string>
有人可以建议任何缺少或错误的步骤吗?我已经尝试了一天。
我脑子里的东西:
DSF-GDB 或 CDI-GDB 重要吗?我不知道我的 Eclipse 使用的是哪一个。
在 Eclipse 中,我的默认 gdb 调试器是 gdb。我将其更改为 usr/bin/gdb。无论哪种方式,两者都没有工作。
我的 Eclipse 使用的 gdb 是否启用了 python?我的 gdb 版本应该支持 python。还是有另一个二进制文件?
编辑:
现在我收到此错误:
报告了多个错误。
1)执行MI命令失败:
-var-create - * state
Error message from debugger back end:
Cannot instantiate printer for default visualiser
2) 无法创建变量对象
3)执行MI命令失败:
-var-create - * state
Error message from debugger back end:
Cannot instantiate printer for default visualiser
状态是一个向量。
更新:
所以我认为当我使用 gcc 4.8 和 g++ 4.8 时,Eclipse 中的打印效果很好。这就是我得到的:
Name : test
Details:std::vector of length 3, capacity 4 = {1, 2, 3}
Default:{...}
Decimal:{...}
Hex:{...}
Binary:{...}
Octal:{...}
Name : [0]
Details:N/A (child of pretty-printed object)
Default:1
Decimal:1
Hex:0x1
Binary:1
Octal:01
我希望这为需要修复的内容提供更多线索。有任何想法吗?
解决方案
推荐阅读
- javascript - 如何使用从 HTML 表单传递给 PHP 的 JavaScript 地理定位对象
- sql - 如何通过 BigQuery 中的每个用户使用线性插值填充不规则缺失的时间序列值?
- javascript - 处理基于 Web 的发件人中的 Chromecast 加载错误
- firebase - React Native FirebaseError:函数 Query.startAfter() 需要有效的第一个参数,但未定义
- google-sheets - 谷歌表格中的连接功能问题
- c - 手动编码的连接函数错误(分段错误(核心转储))
- javascript - 如何使用引导下拉菜单获取提交时的文本?
- python - Django分页python字典
- javascript - How to slow down dropdown box by CSS or jQuery
- cmake - 如何创建多个 cmake 目标,其中一个依赖于另一个的输出?