相关疑难解决方法(0)

GDB的C ++调试/打印自定义类型:nlohmann json库的情况

我正在使用nlohmann的json C ++实现进行项目开发

如何在GDB中轻松浏览nlohmann的JSON键/值?

我尝试使用此STL gdb包装,因为它提供了帮助者探索nlohmann的JSON库正在使用的标准C ++库结构。但是我觉得不方便。

这是一个简单的用例:

json foo;
foo["flex"] = 0.2;
foo["awesome_str"] = "bleh";
foo["nested"] = {{"bar", "barz"}}; 
Run Code Online (Sandbox Code Playgroud)

我想在GDB中拥有什么:

(gdb) p foo
{
    "flex" : 0.2,
    "awesome_str": "bleh",
    "nested": etc.
}
Run Code Online (Sandbox Code Playgroud)

当前行为

(gdb) p foo
$1 = {
  m_type = nlohmann::detail::value_t::object, 
  m_value = {
    object = 0x129ccdd0, 
    array = 0x129ccdd0, 
    string = 0x129ccdd0, 
    boolean = 208, 
    number_integer = 312266192, 
    number_unsigned = 312266192, 
    number_float = 1.5427999782486669e-315
  }
}
(gdb) p foo.at("flex")
Cannot evaluate …
Run Code Online (Sandbox Code Playgroud)

c++ json gdb pretty-print nlohmann-json

17
推荐指数
1
解决办法
922
查看次数

在GDB中调用lambda函数

#include <iostream>                                                             

void do_something(void) {                                                       
        std::cout << "blah blah" << std::endl;                                  

        auto lambda_func = [](void){                                            
                std::cout << "in lambda" << std::endl;                          
                return;                                                         
        };                                                                      

        lambda_func();                                                          

        std::cout << "..." << std::endl;                                        

        return;                                                                 
}                                                                               

int main(int argc, char **argv) {                                               
        do_something();                                                         
        return 0;                                                               
}
Run Code Online (Sandbox Code Playgroud)

在这个示例程序中,如果你编译(g++ gdb-call-lambda.cpp --std=c++11 -g)然后在gdb(gdb ./a.out)中运行它,你可以让GDB调用任何"普通"函数.例:

(gdb) break main
Breakpoint 1 at 0x4008e7: file gdb-call-lambda.cpp, line 20.
(gdb) r
Starting program: /home/keithb/dev/mytest/gdb-call-lambda/a.out 

Breakpoint 1, main (argc=1, argv=0x7fffffffdfb8) at gdb-call-lambda.cpp:20
20      do_something();
(gdb) call do_something()
blah blah …
Run Code Online (Sandbox Code Playgroud)

lambda gdb c++11

13
推荐指数
1
解决办法
1918
查看次数

gdb漂亮的打印与直接函数调用

我正在尝试使用GDB的漂亮打印工具来显示自定义C++矩阵类.

这个课程非常标准,你可以在任何地方找到.它是一个按类型参数化的模板,可以用mat [i] [j]等C类表示法访问.这首先隐式返回表示行或列的另一个模板"Slice"类,[]运算符可以再次访问该类以提取数据.该类本身使用普通的C数组进行存储,但它正在实现一些技巧,比如预先分配更大的矩阵,启用非零启动,使用步幅等选项.该类没有本机打印接口,我无法修改它,或轻松链接我自己的代码.

自定义功能使得在Python中重现直接数据访问代码变得非常痛苦.但那有必要吗?一般来说:为什么漂亮的印刷会重现访问数据的逻辑?我不能只使用C++调用并使用[]运算符来打印第i,第j个元素吗?在这样的请求期间,Slice类在GDB中是临时的,这一事实使这更加复杂.

我也是python和GDB脚本的初学者.我试图破解示例用gdb.execute调用替换数据访问,但我不知道如何从to_string函数访问对象名称,所以我可以使用类似gdb.execute(??? +'[]的东西+ str(i)+']',False,True).

我想知道这样做的最有效方法是什么.

c++ python gdb pretty-print

6
推荐指数
1
解决办法
2028
查看次数

标签 统计

gdb ×3

c++ ×2

pretty-print ×2

c++11 ×1

json ×1

lambda ×1

nlohmann-json ×1

python ×1