• Apache arrow顶级项目调试


    Apache arrow顶级项目调试

    arrow官方从7.x版本开始提供了一个gdb工具,叫做gdb_arrow.py,可以在仓库里面下载下来。

    调试原理可以阅读之前写的文章:

    玩转C++调试之Python的GDB库增强

    使用办法非常简单,直接:

    source /code/arrow/cpp/gdb_arrow.py

    如果在gdb里面source没报错,那么恭喜你加载成功。

    在随后的print arrow的内部结构时,便可以直接以可读的形式展示出来了。

    当然,还可能非常不幸,会报错,各种语法错误,下面来简单说一下解决办法。

    例如:

    1. File "/code/arrow/cpp/gdb_arrow.py", line 60
    2.   f'from GDB\'s response:\n"""{s}"""')
    3.   ^
    4. SyntaxError: invalid syntax

    gdb_arrow.py脚本只支持python3以上版本,如果是python2自然就出错了,例如:上面的语法错误。

    在gdb里面可以检查一下自己的python脚本

    1. (gdb) py
    2. >import sys
    3. >print(sys.version)
    4. >end
    5. 3.8.15 (default, Mar  9 202321:22:48
    6. [GCC 10.2.1 20210130 (Red Hat 10.2.1-11)]

    可以看到输出了python3,那么到这里可以验证python版本没问题,一般来说就是可以source成功的,我这边一开始这样查看出来的版本是python2,自然就source挂了,最后通过源码安装gdb方式,安装了一个比较新的版本就没问题了。

    下面来看看使用脚本与不使用脚本调试的显示情况吧。

    • 默认调试

    1. (gdb) p *schema
    2. $2 = (std::__shared_ptr_access2, falsefalse>::element_type &) @0x5a2dd0: { = {
    3.     _vptr.Fingerprintable = 0x7ffff786fe70 for arrow::Schema+16>, fingerprint_ = {_M_b = {_M_p = 0x0}}, metadata_fingerprint_ = {_M_b = {
    4.         _M_p = 0x0}}}, > = {}, > = {}, impl_ = {
    5.     _M_t = { >> = {
    6.         _M_t = {0, arrow::Schema::Impl*, std::default_delete >> = {1, std::default_delete >> = {1, std::default_deletetrue>> = {> = {}, }, }, 0, arrow::Schema::Impl*, false>> = {_M_head_impl = 0x5a2790}, }, }}, }}}
    • 脚本调试

    1. (gdb) p *schema
    2. $3 = (std::__shared_ptr_access2, falsefalse>::element_type &) @0x5a2dd0: arrow::Schema with 3 fields = {["fd0"] = arrow::int32(), 
    3.   ["fd1"] = arrow::uint8(), ["fd2"] = arrow::int16()}

    再试试batch

    1. (gdb) p *b1
    2. $4 = (std::__shared_ptr_access2, falsefalse>::element_type &) @0x5a2a90: arrow::RecordBatch with 3 columns, 10 rows = {
    3.   ["fd0"] = arrow::ArrayData of type arrow::int32(), length 10, offset 0, null count 0 = {44026035214278037911601077171-3004152971521318915-1491074194-1019370501
    4.     -876914235791665453-229504221}, ["fd1"] = arrow::ArrayData of type arrow::uint8(), length 10, offset 0, null count 0 = {021561261431422685179127}, 
    5.   ["fd2"] = arrow::ArrayData of type arrow::int16(), length 10, offset 0, null count 0 = {-104966717-290412178632691244301727-45843174723213}}

    可以看到的是非常的直观!

    以后调试arrow又更加方便了。

  • 相关阅读:
    【面试普通人VS高手系列】Dubbo的服务请求失败怎么处理?
    基础课27——人工智能训练师人才画像
    LED智能家居灯 开关调光 台灯落地灯控制驱动 降压恒流IC AP5191
    C. Number Game(博弈)
    linux权限管理之SetUID&SetGID
    矩阵分解方法(主要是非负矩阵分解)--学习笔记
    如何避免远程访问欺诈?让远程办公更加安全的六个建议
    十、补码朴素贝叶斯算法(Complement NB,Complement Naive Bayes)(有监督学习)
    文件传输、文件挂载MOUNT:NFS、CIFS、ADB、SAMBA
    第一次写计算机论文无从下手怎么办?(一) - 易智编译easeediting
  • 原文地址:https://blog.csdn.net/guangcheng0312q/article/details/132644672