2012-02-29 8 views
7

Używam gdb do debugowania mojego programu C++. Używam biblioteki numerycznej Armadillo do definiowania moich macierzy. Mam macierz pancernika zdefiniowaną tak:Czy istnieje sposób drukowania matrycy pancernika w gdb?

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

Czy możliwe jest wydrukowanie całej macierzy podczas korzystania z debuggera gdb?

+0

Najnowsze gdb (najnowsze wydanie to GDB 7.4) może b e skryptowane w Pythonie. Czy myślałeś o tym? –

Odpowiedz

2

Możesz wywoływać funkcje C w gdb, więc potrzebujesz tylko funkcji, która drukuje twoje obiekty. Np .:

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

Pytanie może być stare, ale natknięcie się na to sprawiło, że znalazłem rozwiązanie dla mojej pracy.

Ze względu na charakter bazie szablonu biblioteki Armadillo trzeba podać kilka pomocników własnego:

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

Teraz można łatwo wywołać print_matrix od wewnątrz 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 

Dzięki do ukończenia tabulatora wystarczy wpisać kilka znaków z print_matrix<arma::Mat<double> >.

1

Dla tych użyciu Qt Creator, można sprawdzić wartości z IDE przez extending GDB with Python Debugging Helpers (być może inne IDE obsługuje tej funkcji zbyt).

Umieść poniższy skrypt, na przykład, ~/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 

i nazywają to dodanie tej linii do ~/.gdbinit:

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

lub dodać go z IDE; w QtCreator użyj Narzędzia> Opcje> Debugger> GDB (tab)> Dodatkowe narzędzia do debugowania (u dołu).

Ten konkretny skrypt zwróci macierz umieszczoną na kolumnach (naturalny układ pamięci w moim architektury):

enter image description here

Źródła: Writing Debug Visualizers for GDB/QtCreator 2.8

+0

Mam problem z uruchomieniem tego w QtCreator 3.4.0. Wszystkie macierze pancerne otrzymują wartość "". Myślę, że może to być związane z tym, że mój gdb jest połączony z Pythonem 3. Czy masz jakieś sugestie? Dodaję skrypt za pomocą 'python exec (open (filename) .read())', który jest kompatybilny z Python 3 ('execfile' nie jest). –

+0

W końcu dostałem swój skrypt do pracy po pracy. Zakończyłem kompilację najnowszego gdb (7.9.1), łącząc go z Pythonem 2 zamiast 3, używając './configure --prefix/usr/local/gdb-python2 --with-python', a następnie używając tego gdb w QtCreator. Musiałem też dodać 'import gdb' i' from dumper import * 'na górę' debugHelpers.py'.Ale wciąż chciałbym wersję skryptu, która działa z gdb i Python 3, ponieważ Python 3 wydaje się teraz domyślny. –

+1

Mam teraz działa z gdb połączony z Python 3. Najpierw dodaj 'import gdb' i' import dumper', następnie zmień wywołania 'Children()' na 'dumper.Children()' i 'range (0, numDisplayItems) 'do' zasięgu (0, int (numDisplayItems)) '. Kompletny skrypt można znaleźć [tutaj] (http://pastebin.com/YjbJr4wv) (link do pastebin). –

0

Najprostszym sposobem jest drukowanie bezpośrednio w gdb niestety bez ozdobnego formatu

> 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}} 
Powiązane problemy