Fandom

Drizzle Wiki

Debug di Drizzle con GDB

32pagine in
this wiki
Crea nuova pagina
Discussione0 Condividi

Ecco cosa faccio in genere per utilizzare GDB...

Compilo il server con i simboli di debug (--enable-debug) in /tmp utilizzando lo script allegato, poi:

cd /tmp/mybranch/tests ./dtr --start-and-exit --gdb

Questo apre un'istanza GDB per il processo server, che aspetta connessioni client... procediamo e creiamone una:

Torniamo al terminale e facciamo:

cd /tmp/mybranch/client ./drizzle --user=root --port=9306

Noterai che il client sembra disconnettersi.Torniamo alla sessione GDB che abbiamo aperto per il server e noterai che GDB (in effetti la test suite...) ha impostato un breakpoint alla funzione mysql_parse(). Vedrai qualcosa del genere:

[Switching to Thread 0xb317fb90 (LWP 11710)]

Breakpoint 1, mysql_parse (thd=0x8878c18),

    inBuf=0x8882290 "select @@version_comment limit 1", length=32,
    found_semicolon=0xb317f040) at sql_parse.cc:2870

2870 const char ** found_semicolon) (gdb)

Questo messaggio essenzialmente mostra lo stack delle chiamate e gli indirizzi degli argomenti che vengono passati alla funzione mysql_parse(), che si trova in The above is basically showing you the function call stack and argument drizzled/sql_parse.cc alla riga 2870.

Per vedere tutto lo stack:

(gdb) where

Vedrai che lo stack delle chiamate va dallo scheduler (libevent_thread_proc()) al parser (do_command(), poi dispatch_command(), poi mysql_parse()).

Per entrare nel processo server:

(gdb) step

Questo eseguirà la prossima chiamata. Semplicemente premi enter per ripetere il passaggio. Per vedere il contenuto di una variabile di volta in volta, semplicemente digita:

(gdb) print name_of_variable

Per esempio, se faccio:

(gdb) print thd

Ottengo:

$1 = (class THD*) 0x8878c18

Posso anche accedere alle variabili membro di un puntatore, come l'id della query corrente:

(gdb) print thd->query_id

$2 = 1

E così via...

Puoi impostare un altro breakpoint (per esempio una funzione che ti interessa) in questo modo:

(gdb) break function_name

Per esempio se scorro il codice sorgente mi accorgo che una volta che una SELECT è eseguita dal client, viene chiamata la funzione mysql_select(), quindi posso fare:

(gdb) break mysql_select

GDB ti informa che è stato impostato un breakpoint e ti dice il numero di riga, in questo modo:

Breakpoint 2 at 0x814ea09: file sql_select.cc, line 2618.

Per continuare fino a quel breakpoint:

(gdb) continue

Ora sei arrivato a mysql_select()...

Continua oltre e poi torna al terminale con il client drizzle. Dovresti vedere un client al prompt dei comandi, così:

[503][jpipes@serialcoder: /tmp/trunk/client]$ ./drizzle --user=root --port=9306 Welcome to the Drizzle client.. Commands end with ; or \g. Your Drizzle connection id is 1 Server version: 7.0.0-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

drizzle>>

Tieni aperto questo client, perchè eseguirai dei comandi in esso.

Nella sessione GDB scrivi:

(gdb) break mysql_parse (gdb) continue

Poi torna al client:

drizzle>> SELECT * FROM INFORMATION_SCHEMA.TABLES;

e torna nuovamente alla sessione server GDB. Vedrai che GDB si è interrotto nuovamente a mysql_parse() e che inBuf contiene la query "SELECT * FROM INFORMATION_SCHEMA.TABLES" che hai appena lanciato...

Ora gioca un po' con GDB e guarda cosa riesci a fare :)

Saluti, e spero che questo articolo ti sia stato d'aiuto,

Jay

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Inoltre su Fandom

Wiki a caso