Misalkan memiliki sesuatu seperti ini:
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
Saya ingin dapat memeriksa isi peta yang menjalankan program dari gdb.
Jika saya mencoba menggunakan operator subskrip, saya mendapatkan:
(gdb) p m[1]
Attempt to take address of value not located in memory.
Menggunakan metode find tidak memberikan hasil yang lebih baik:
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
Apakah ada cara untuk menyelesaikan ini?
Jawaban:
Saya pikir tidak ada, setidaknya tidak jika sumber Anda dioptimalkan dll. Namun, ada beberapa makro untuk gdb yang dapat memeriksa kontainer STL untuk Anda:
http://sourceware.org/ml/gdb/2008-02/msg00064.html
Namun, saya tidak menggunakan ini, jadi YMMV
sumber
Jawaban yang ada untuk pertanyaan ini sudah sangat kuno. Dengan GCC dan GDB baru-baru ini, ini Just Works TM berkat dukungan Python bawaan di GDB 7.x dan printer cantik libstdc ++ yang disertakan dengan GCC.
Untuk contoh OP saya dapatkan:
(gdb) print m $1 = std::map with 2 elements = {[1] = 2, [2] = 4}
Jika tidak bekerja secara otomatis untuk Anda, lihat poin peluru pertama di halaman Dukungan STL di wiki GDB.
Anda juga dapat menulis printer cantik Python untuk tipe Anda sendiri, lihat Pretty Printing di manual GDB.
sumber
Could not find operator[]
.Selalu ada yang jelas: Tentukan fungsi pengujian Anda sendiri ... Sebut saja dari gdb. Misalnya:
#define SHOW(X) cout << # X " = " << (X) << endl void testPrint( map<int,int> & m, int i ) { SHOW( m[i] ); SHOW( m.find(i)->first ); } int main() { std::map<int,int> m; m[1] = 2; m[2] = 4; return 0; // Line 15. }
Dan:
.... Breakpoint 1 at 0x400e08: file foo.C, line 15. (gdb) run Starting program: /tmp/z/qD Breakpoint 1, main () at qD.C:15 (gdb) call testPrint( m, 2) m[i] = 4 (*m.find(i)).first = 2 (gdb)
sumber
The
stl-views.gdb
digunakan untuk menjadi jawaban terbaik ada, tapi sekarang tidak lagi.Hal ini tidak terintegrasi ke dalam arus utama
GDB
, tapi di sini adalah apa yang Anda mendapatkan menggunakan 'pemanah-tromey-python' cabang :(gdb) list 1 #include <map> 2 int main(){ 3 std::map<int,int> m; 4 m[1] = 2; 5 m[2] = 4; 6 return 0; 7 } (gdb) break 6 Breakpoint 1 at 0x8048274: file map.cc, line 6. (gdb) run Breakpoint 1, main () at map.cc:6 6 return 0; (gdb) print m $1 = std::map with 2 elements = { [1] = 2, [2] = 4 } (gdb) quit
sumber
Coba De-Referencing STL Containers: di halaman ini: http://www.yolinux.com/TUTORIALS/GDB-Commands.html
sumber
Jawaban di atas berfungsi dan baik-baik saja. Jika Anda menggunakan stl-views.gdb, berikut adalah cara yang tepat untuk menampilkan peta dan elemen di dalamnya. Biarkan peta Anda sebagai berikut:
std::map<char, int> myMap;
(gdb) pmap myMap char int
yaitu
pmap <variable_name> <left_element_type> <right_element_type>
untuk melihat elemen di peta.Semoga membantu.
sumber
Anda bisa mengatasi masalah kedua (
Cannot evaluate function -- may be inlined
) dengan memastikan bahwa kompilator Anda menggunakan informasi debug DWARF-2 (atau 3 atau 4) saat Anda mengompilasi program Anda. DWARF-2 menyertakan informasi sebaris, jadi Anda harus dapat menggunakan salah satu metode yang Anda jelaskan untuk mengakses elemenstd::map
penampung Anda .Untuk mengompilasi dengan info debug DWARF-2, tambahkan
-gdwarf-2
tanda ke perintah kompilasi Anda.sumber