Есть ли способ напечатать матрицу Armadillo в GDB? - PullRequest
7 голосов
/ 29 февраля 2012

Я использую GDB для отладки моей программы на C ++.Я использую числовую библиотеку броненосца для определения своих матриц.У меня есть матрица броненосца, определенная так:

mat A = randu<mat>(5,5);

Можно ли напечатать всю матрицу при использовании отладчика gdb?

Ответы [ 4 ]

8 голосов
/ 31 марта 2014

Вопрос может быть старым, но спотыкаться о нем заставил меня найти решение для моей собственной работы.

В связи с тем, что библиотека Armadillo основана на шаблонах, вам необходимо предоставить несколько собственных помощников:

#include <iostream>
#include <armadillo>

template<class Matrix>
void print_matrix(Matrix matrix) {
    matrix.print(std::cout);
}

//provide explicit instantiations of the template function for 
//every matrix type you use somewhere in your program.
template void print_matrix<arma::mat>(arma::mat matrix);
template void print_matrix<arma::cx_mat>(arma::cx_mat matrix);

int main() {
    arma::mat matrix = arma::randu(10,10);

    return 0;
}

Теперь вы можете легко звонить print_matrix из gdb:

(gdb) call print_matrix<arma::Mat<double> >(matrix) 
   0.8402   0.4774   0.0163   0.5129   0.5267   0.5260   0.2383   0.5316   0.6879   0.9565
   0.3944   0.6289   0.2429   0.8391   0.7699   0.0861   0.9706   0.0393   0.1660   0.5886
   0.7831   0.3648   0.1372   0.6126   0.4002   0.1922   0.9022   0.4376   0.4401   0.6573
   0.7984   0.5134   0.8042   0.2960   0.8915   0.6632   0.8509   0.9318   0.8801   0.8587
   0.9116   0.9522   0.1567   0.6376   0.2833   0.8902   0.2667   0.9308   0.8292   0.4396
   0.1976   0.9162   0.4009   0.5243   0.3525   0.3489   0.5398   0.7210   0.3303   0.9240
   0.3352   0.6357   0.1298   0.4936   0.8077   0.0642   0.3752   0.2843   0.2290   0.3984
   0.7682   0.7173   0.1088   0.9728   0.9190   0.0200   0.7602   0.7385   0.8934   0.8148
   0.2778   0.1416   0.9989   0.2925   0.0698   0.4577   0.5125   0.6400   0.3504   0.6842
   0.5540   0.6070   0.2183   0.7714   0.9493   0.0631   0.6677   0.3540   0.6867   0.9110

Благодаря завершению табуляции вам нужно всего лишь набрать несколько символов print_matrix<arma::Mat<double> >.

2 голосов
/ 29 февраля 2012

Вы можете вызывать функции C в gdb, поэтому вам просто нужна функция, которая печатает ваши объекты.Например:

(gdb) call printf("%.2f", 3.1428)
$7 = 4
(gdb) call fflush(stdout)
3.14$8 = 0
1 голос
/ 01 мая 2015

Для тех, кто использует QtCreator , вы можете проверить значения из вашей IDE с помощью , расширяющего GDB с помощью Python Debugging Helpers (возможно, другие IDE также поддерживают эту функцию).

Поместите следующий скрипт, например, ~/debugHelpers.py

#!/usr/bin/python

import gdb      # gdb.Value()
import dumper   # dumper.Children()

def qdump__arma__Mat(d, value):
    array = value["mem"]
    cols = value["n_cols"]
    rows = value["n_rows"]
    maxDisplayItems = 50
    innerType = d.templateArgument(value.type, 0)
    p = gdb.Value(array.cast(innerType.pointer()))
    d.putItemCount(cols)
    d.putNumChild(cols)
    if d.isExpanded():
        numDisplayItems = min(maxDisplayItems, cols)
        with dumper.Children(d, numChild=cols,
               maxNumChild=numDisplayItems,
               childType="<column>",
               addrBase=p,
               addrStep=p.dereference().__sizeof__):
            for i in range(0, int(numDisplayItems)):
                with dumper.Children(d):
                    d.putItemCount(rows)
                    d.putNumChild(rows)
                    if d.isExpanded():
                        numDisplayItems = min(maxDisplayItems, rows)
                        with dumper.Children(d, numChild=rows,
                               maxNumChild=numDisplayItems,
                               childType=innerType,
                               addrBase=p,
                               addrStep=p.dereference().__sizeof__):
                            for j in range(0, int(numDisplayItems)):
                                d.putSubItem(j, p.dereference())
                                p += 1

И назовите это добавлением этой строки к вашему ~/.gdbinit:

python exec(open('/<full_path>/debugHelpers.py').read())

или добавьте его из вашей IDE; в QtCreator используйте Инструменты> Параметры> Отладчик> GDB (вкладка)> Дополнительные помощники отладки (внизу).

Этот конкретный скрипт вернет матрицу, упорядоченную по столбцам (естественное расположение памяти в моей архитектуре):

enter image description here

Источники: Написание отладочных визуализаторов для GDB / QtCreator 2.8

0 голосов
/ 11 февраля 2017

Самый простой способ - это печатать напрямую в gdb, к сожалению, нет необычного формата

> print *A.mem@5@5
$1 = {{0.84018771715470952, 0.39438292681909304,0.78309922375860586,0.79844003347607329, 0.91164735793678431},
{0.19755136929338396, 0.33522275571488902, 0.768229594811904, 0.27777471080318777, 0.55396995579543051}, 
{0.47739705186216025, 0.62887092476192441, 0.36478447279184334, 0.51340091019561551, 0.95222972517471283}, 
{0.91619506800370065, 0.63571172795990094, 0.71729692943268308, 0.14160255535580338, 0.60696887625705864}, 
{0.016300571624329581, 0.24288677062973696, 0.13723157678601872, 0.80417675422699042, 0.15667908925408455}}
...