2012-02-29 6 views
7

Sto usando gdb per eseguire il debug del mio programma C++. Sto usando la libreria numerica armadillo per definire le mie matrici. Ho una matrice armadillo definita in questo modo:C'è un modo per stampare una matrice Armadillo in gdb?

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

E 'possibile stampare l'intera matrice mentre si utilizza il debugger gdb?

+0

Recenti gdb (ultima versione è GDB 7.4) può b e script in Python. Lo hai preso in considerazione ?? –

risposta

2

È possibile chiamare le funzioni C in gdb, quindi è sufficiente una funzione per la stampa degli oggetti. E.g:

(gdb) call printf("%.2f", 3.1428) 
$7 = 4 
(gdb) call fflush(stdout) 
3.14$8 = 0 
7

La domanda può essere vecchia, ma inciampare su di esso mi ha fatto trovare una soluzione per il mio lavoro.

A causa della natura basato sul modello della biblioteca Armadillo è necessario fornire alcuni aiutanti di tua scelta:

#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; 
} 

Ora si può facilmente chiamare print_matrix dall'interno 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 

Grazie per completare il tab è necessario solo digitare alcuni caratteri di print_matrix<arma::Mat<double> >.

1

Per coloro che utilizzano QtCreator, è possibile controllare i valori dal vostro IDE da extending GDB with Python Debugging Helpers (forse altri IDE supportano questa caratteristica troppo).

Inserire il seguente script, per esempio, ~/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 

e lo chiamano aggiungendo questa linea al vostro ~/.gdbinit:

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

o aggiungerlo dal vostro IDE; in QtCreator utilizzare Strumenti> Opzioni> Debugger> GDB (scheda)> Ulteriori helper di debug (nella parte inferiore).

Questo script particolare tornerà la matrice organizzato da colonne (arrangiamento di memoria naturale nella mia architettura):

enter image description here

Fonti: Writing Debug Visualizers for GDB/QtCreator 2.8

+0

Ho problemi a far funzionare questo in QtCreator 3.4.0. Tutte le matrici di Armadillo hanno il valore ''. Penso che potrebbe essere correlato al fatto che il mio gdb è collegato a Python 3. Hai qualche suggerimento? Sto aggiungendo lo script usando 'python exec (open (filename) .read())', che è compatibile con Python 3 ('execfile' non lo è). –

+0

Ho finalmente ottenuto il tuo script per funzionare dopo un po 'di lavoro. Ho finito per compilare l'ultimo gdb (7.9.1), collegandolo a Python 2 anziché a 3 usando './configure --prefix/usr/local/gdb-python2 --with-python', e poi usando quel gdb in QtCreator. Ho anche dovuto aggiungere 'import gdb' e' from dumper import * 'all'inizio di' debugHelpers.py'.Ma mi piacerebbe ancora una versione dello script che funziona con gdb e Python 3, dal momento che Python 3 sembra essere il default adesso. –

+1

Ora lavoro con gdb collegato a Python 3. Prima aggiungi 'import gdb' e' import dumper', quindi cambia le chiamate 'Children()' a 'dumper.Children()' e 'range (0, numDisplayItems) 'to' range (0, int (numDisplayItems))'. È possibile trovare uno script completo [qui] (http://pastebin.com/YjbJr4wv) (collegamento a pastebin). –

0

Il modo più semplice è quello di stampare direttamente in gdb, purtroppo senza fantasia

> print *[email protected]@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}}