Ini adalah perintah valgrind.bin yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa stasiun kerja online gratis kami seperti Ubuntu Online, Fedora Online, emulator online Windows atau emulator online MAC OS
PROGRAM:
NAMA
valgrind - seperangkat alat untuk men-debug dan membuat profil program
RINGKASAN
valgrind [valgrind-opsi] [program-Anda] [pilihan-program-Anda]
DESKRIPSI
valgrind adalah program fleksibel untuk debugging dan profil executable Linux. Terdiri dari
dari inti, yang menyediakan CPU sintetis dalam perangkat lunak, dan serangkaian debugging dan
alat pembuatan profil. Arsitekturnya modular, sehingga alat baru dapat dibuat dengan mudah dan
tanpa mengganggu struktur yang ada.
Beberapa opsi yang dijelaskan di bawah ini berfungsi dengan semua alat Valgrind, dan beberapa hanya berfungsi dengan
beberapa atau satu. Bagian OPSI MEMCHECK dan yang di bawahnya menjelaskan khusus alat
Pilihan.
Halaman manual ini hanya mencakup penggunaan dan opsi dasar. Untuk informasi lebih lengkap,
silakan lihat dokumentasi HTML di sistem Anda:
$INSTALL/share/doc/valgrind/html/index.html, atau online:
http://www.valgrind.org/docs/manual/index.html.
ALAT SELEKSI PILIHAN
Satu-satunya pilihan yang paling penting.
--alat= [bawaan: memeriksa]
Jalankan alat Valgrind yang disebut nama alat, misalnya memcheck, cachegrind, callgrind, helgrind,
drd, massif, antek, tidak ada, exp-sgcheck, exp-bbv, exp-dhat, dll.
BASIC PILIHAN
Opsi ini berfungsi dengan semua alat.
-h --membantu
Tampilkan bantuan untuk semua opsi, baik untuk inti maupun untuk alat yang dipilih. Jika pilihan
diulang itu setara dengan memberi --bantuan-debug.
--bantuan-debug
Sama dengan --membantu, tetapi juga mencantumkan opsi debug yang biasanya hanya berguna untuk
Pengembang Valgrind.
--Versi: kapan
Tunjukkan nomor versi inti Valgrind. Alat dapat memiliki versinya sendiri
angka. Ada skema untuk memastikan bahwa alat hanya dijalankan ketika inti
versi adalah salah satu yang mereka ketahui untuk digunakan. Hal ini dilakukan untuk meminimalkan kemungkinan
masalah aneh yang timbul dari ketidakcocokan versi alat-vs-inti.
-q, --diam
Jalankan tanpa suara, dan hanya cetak pesan kesalahan. Berguna jika Anda menjalankan regresi
tes atau memiliki beberapa mesin uji otomatis lainnya.
-v, --bertele-tele
Lebih bertele-tele. Memberikan informasi tambahan tentang berbagai aspek program Anda, seperti:
objek bersama dimuat, penekanan yang digunakan, kemajuan instrumentasi
dan mesin eksekusi, dan peringatan tentang perilaku yang tidak biasa. Mengulangi opsi
meningkatkan tingkat verbositas.
--trace-children= [bawaan: tidak]
Saat diaktifkan, Valgrind akan melacak ke dalam sub-proses yang dimulai melalui eksekutif sistem
panggilan. Ini diperlukan untuk program multi-proses.
Perhatikan bahwa Valgrind memang melacak ke anak a garpu (akan sulit untuk tidak,
sejak garpu membuat salinan identik dari suatu proses), jadi opsi ini bisa dibilang buruk
bernama. Namun, kebanyakan anak-anak dari garpu telpon langsung telpon eksekutif pula.
--trace-children-skip=patt1,patt2,...
Opsi ini hanya berpengaruh ketika --trace-children=ya ditentukan. Hal ini memungkinkan untuk
beberapa anak untuk dilewati. Opsi mengambil daftar pola yang dipisahkan koma untuk
nama executable anak yang tidak boleh dilacak oleh Valgrind. Pola mungkin
termasuk metakarakter? dan *, yang memiliki arti biasa.
Ini dapat berguna untuk memangkas cabang yang tidak menarik dari pohon proses yang sedang
berjalan di Valgrind. Namun Anda harus berhati-hati saat menggunakannya. Saat Valgrind melewatkan penelusuran
menjadi executable, itu tidak hanya melewatkan tracing yang dapat dieksekusi, itu juga melompati
melacak salah satu proses anak yang dapat dieksekusi itu. Dengan kata lain, bendera tidak
hanya menyebabkan tracing berhenti pada executable yang ditentukan -- itu melewatkan tracing dari
seluruh subpohon proses berakar pada salah satu executable yang ditentukan.
--trace-children-skip-by-arg=patt1,patt2,...
Ini sama dengan --jejak-anak-lewati, dengan satu perbedaan: keputusan untuk
apakah akan melacak ke proses anak dibuat dengan memeriksa argumen ke anak
proses, bukan nama executable-nya.
--anak-diam-setelah-garpu= [bawaan: tidak]
Saat diaktifkan, Valgrind tidak akan menampilkan output debugging atau logging apa pun untuk anak itu
proses yang dihasilkan dari garpu panggilan. Ini dapat membuat output tidak terlalu membingungkan (walaupun
lebih menyesatkan) ketika berhadapan dengan proses yang menciptakan anak-anak. Hal ini terutama
berguna dalam hubungannya dengan --jejak-anak=. Penggunaan opsi ini juga sangat kuat
disarankan jika Anda meminta keluaran XML (--xml=ya), karena jika tidak, XML dari
anak dan orang tua mungkin menjadi campur aduk, yang biasanya membuatnya tidak berguna.
--vgdb= [bawaan: Ya]
Valgrind akan menyediakan fungsionalitas "gdbserver" ketika --vgdb=ya or --vgdb=penuh is
ditentukan. Ini memungkinkan debugger GNU GDB eksternal untuk mengontrol dan men-debug program Anda
saat dijalankan di Valgrind. --vgdb=penuh menimbulkan overhead kinerja yang signifikan, tetapi
memberikan breakpoint dan watchpoint yang lebih presisi. Lihat Men-debug program Anda menggunakan
Gdbserver dan GDB Valgrind untuk deskripsi mendetail.
Jika gdbserver tertanam diaktifkan tetapi tidak ada gdb yang sedang digunakan, vgdb
utilitas baris perintah dapat mengirim "perintah monitor" ke Valgrind dari shell. NS
Inti Valgrind menyediakan satu set perintah monitor Valgrind. Sebuah alat dapat opsional
memberikan perintah monitor khusus alat, yang didokumentasikan dalam alat khusus
bab.
--vgdb-error= [bawaan: 999999999]
Gunakan opsi ini ketika gdbserver Valgrind diaktifkan dengan --vgdb=ya or --vgdb=penuh.
Alat yang melaporkan kesalahan akan menunggu kesalahan "angka" untuk dilaporkan sebelum membeku
program dan menunggu Anda terhubung dengan GDB. Oleh karena itu nilai nol
akan menyebabkan gdbserver dimulai sebelum program Anda dijalankan. Ini adalah
biasanya digunakan untuk memasukkan breakpoint GDB sebelum eksekusi, dan juga berfungsi dengan alat
yang tidak melaporkan kesalahan, seperti Massif.
--vgdb-stop-at= [bawaan: tidak ada]
Gunakan opsi ini ketika gdbserver Valgrind diaktifkan dengan --vgdb=ya or --vgdb=penuh.
Gdbserver Valgrind akan dipanggil untuk setiap kesalahan setelah --vgdb-kesalahan telah
dilaporkan. Anda juga dapat meminta gdbserver Valgrind untuk dipanggil untuk lainnya
peristiwa, ditentukan dalam salah satu cara berikut:
· daftar dipisahkan koma dari satu atau lebih dari startup keluar valgrindabexit.
Nilai startup keluar valgrindabexit masing-masing menunjukkan untuk memanggil gdbserver
sebelum program Anda dijalankan, setelah instruksi terakhir dari program Anda, pada
Valgrind keluar tidak normal (misalnya kesalahan internal, kehabisan memori, ...).
Catatan: startup dan --vgdb-kesalahan=0 keduanya akan menyebabkan Valgrind gdbserver dipanggil
sebelum program Anda dijalankan. NS --vgdb-kesalahan=0 Selain itu akan menyebabkan Anda
program untuk menghentikan semua kesalahan berikutnya.
· semua untuk menentukan set lengkap. Ini setara dengan
--vgdb-stop-at=startup,keluar,valgrindabexit.
· tak satupun untuk himpunan kosong.
--track-fds= [bawaan: tidak]
Saat diaktifkan, Valgrind akan mencetak daftar deskriptor file terbuka saat keluar atau aktif
permintaan, melalui perintah monitor gdbserver v.info buka_fds. Bersama dengan setiap file
deskriptor dicetak jejak balik tumpukan tempat file dibuka dan detail apa pun
berkaitan dengan deskriptor file seperti nama file atau detail soket.
--time-stamp= [bawaan: tidak]
Saat diaktifkan, setiap pesan didahului dengan indikasi jam dinding yang telah berlalu
waktu sejak startup, dinyatakan sebagai hari, jam, menit, detik dan milidetik.
--log-fd= [bawaan: 2, stderr]
Menentukan bahwa Valgrind harus mengirim semua pesannya ke file yang ditentukan
deskriptor. Standarnya, 2, adalah saluran kesalahan standar (stderr). Perhatikan bahwa ini mungkin
mengganggu penggunaan stderr klien sendiri, karena output Valgrind akan
disisipkan dengan output apa pun yang dikirim klien ke stderr.
--log-file=
Menentukan bahwa Valgrind harus mengirim semua pesannya ke file yang ditentukan. jika
nama file kosong, itu menyebabkan batal. Ada tiga penentu format khusus yang
dapat digunakan dalam nama file.
%p diganti dengan ID proses saat ini. Ini sangat berguna untuk program yang
memanggil beberapa proses. PERINGATAN: Jika Anda menggunakan --trace-children=ya dan program Anda
memanggil beberapa proses ATAU garpu program Anda tanpa memanggil exec sesudahnya, dan
Anda tidak menggunakan penentu ini (atau %q specifier di bawah), output Valgrind dari semua
proses tersebut akan masuk ke dalam satu file, mungkin campur aduk, dan mungkin tidak lengkap.
%q{FOO} diganti dengan isi variabel lingkungan FOO. Jika {FOO}
bagian cacat, itu menyebabkan aborsi. Specifier ini jarang dibutuhkan, tetapi sangat
berguna dalam keadaan tertentu (misalnya saat menjalankan program MPI). Idenya adalah bahwa Anda
tentukan variabel yang akan diatur secara berbeda untuk setiap proses dalam pekerjaan, untuk
contoh BPROC_RANK atau apa pun yang berlaku di pengaturan MPI Anda. Jika bernama
variabel lingkungan tidak disetel, itu menyebabkan pembatalan. Perhatikan bahwa dalam beberapa kulit, {
dan } karakter mungkin perlu diloloskan dengan garis miring terbalik.
%% diganti dengan %.
Jika % diikuti oleh karakter lain, itu menyebabkan batal.
Jika nama file menentukan nama file relatif, itu dimasukkan ke dalam inisial program
direktori kerja : ini adalah direktori saat ini ketika program dimulai
eksekusi setelah fork atau setelah exec. Jika itu menentukan nama file absolut (mis.
dimulai dengan '/') kemudian diletakkan di sana.
--log-socket=
Menentukan bahwa Valgrind harus mengirim semua pesannya ke port yang ditentukan di
alamat IP yang ditentukan. Port dapat dihilangkan, dalam hal ini port 1500 digunakan. Jika sebuah
koneksi tidak dapat dibuat ke soket yang ditentukan, Valgrind kembali menulis
output ke kesalahan standar (stderr). Opsi ini dimaksudkan untuk digunakan dalam
hubungannya dengan program valgrind-listener. Untuk lebih jelasnya, lihat
komentar dalam manual.
TERKAIT KESALAHAN PILIHAN
Opsi ini digunakan oleh semua alat yang dapat melaporkan kesalahan, misalnya Memcheck, tetapi tidak
penggilingan cache.
--xml= [bawaan: tidak]
Saat diaktifkan, bagian penting dari output (misalnya pesan kesalahan alat) akan di
format XML daripada teks biasa. Selanjutnya, output XML akan dikirim ke a
saluran keluaran yang berbeda dari keluaran teks biasa. Karena itu, Anda juga harus menggunakannya
of --xml-fd, --xml-file or --xml-soket untuk menentukan di mana XML akan dikirim.
Pesan yang kurang penting akan tetap dicetak dalam teks biasa, tetapi karena XML
output dan output teks biasa dikirim ke saluran output yang berbeda (tujuan dari
output teks biasa masih dikendalikan oleh --log-fd, --file-log dan --log-soket)
ini seharusnya tidak menimbulkan masalah.
Opsi ini ditujukan untuk membuat hidup lebih mudah bagi alat yang menggunakan output Valgrind sebagai
input, seperti ujung depan GUI. Saat ini opsi ini berfungsi dengan Memcheck, Helgrind,
DRD dan SG cek. Format output ditentukan dalam file
docs/internals/xml-output-protocol4.txt di pohon sumber untuk Valgrind 3.5.0 atau
nanti.
Opsi yang disarankan untuk dilewati GUI, saat meminta keluaran XML, adalah: --xml=ya
untuk mengaktifkan keluaran XML, --xml-file untuk mengirim output XML ke (mungkin dipilih GUI)
file, --file-log untuk mengirim output teks biasa ke file pilihan GUI kedua,
--child-silent-after-fork=ya, dan -q untuk membatasi output teks biasa menjadi kritis
pesan kesalahan yang dibuat oleh Valgrind sendiri. Misalnya, kegagalan untuk membaca yang ditentukan
file supresi dianggap sebagai pesan kesalahan kritis. Dengan cara ini, untuk sukses
menjalankan file output teks akan kosong. Tetapi jika tidak kosong, maka itu akan berisi
informasi penting yang harus diketahui oleh pengguna GUI.
--xml-fd= [bawaan: -1, dengan disabilitas]
Menentukan bahwa Valgrind harus mengirimkan output XML-nya ke deskriptor file yang ditentukan.
Itu harus digunakan bersama dengan --xml=ya.
--xml-file=
Menentukan bahwa Valgrind harus mengirimkan output XML-nya ke file yang ditentukan. Itu pasti
digunakan bersama dengan --xml=ya. Apa saja %p or %q urutan muncul dalam nama file
diperluas dengan cara yang persis sama seperti untuk --file-log. Lihat deskripsi
of --file-log untuk rincian.
--xml-socket=
Menentukan bahwa Valgrind harus mengirim output XML-nya ke port yang ditentukan pada yang ditentukan
Alamat IP. Itu harus digunakan bersama dengan --xml=ya. Bentuk argumennya adalah
sama seperti yang digunakan oleh --log-soket. Lihat deskripsi dari --log-soket untuk selanjutnya
rincian.
--xml-user-comment=
Menyematkan string komentar pengguna tambahan di awal keluaran XML. Hanya berfungsi ketika
--xml=ya ditentukan; diabaikan sebaliknya.
--demangle= [bawaan: Ya]
Mengaktifkan/menonaktifkan demangling (decoding) otomatis nama C++. Diaktifkan secara default. Kapan
diaktifkan, Valgrind akan mencoba menerjemahkan nama C++ yang disandikan kembali ke sesuatu
mendekati aslinya. Demangler menangani simbol yang dihancurkan oleh g++ versi 2.X,
3.X dan 4.X.
Fakta penting tentang demangling adalah bahwa nama fungsi disebutkan dalam penekanan
file harus dalam bentuk yang hancur. Valgrind tidak membongkar nama fungsi ketika
mencari penindasan yang berlaku, karena melakukan sebaliknya akan membuat penindasan
isi file tergantung pada keadaan mesin demangling Valgrind, dan juga lambat
pencocokan penekanan bawah.
--jumlah-penelepon= [bawaan: 12]
Menentukan jumlah maksimum entri yang ditampilkan dalam jejak tumpukan yang mengidentifikasi program
lokasi. Perhatikan bahwa kesalahan sering terjadi hanya dengan menggunakan empat lokasi fungsi teratas
(tempat dalam fungsi saat ini, dan tiga pemanggil langsungnya). Jadi ini
tidak mempengaruhi jumlah total kesalahan yang dilaporkan.
Nilai maksimum untuk ini adalah 500. Perhatikan bahwa pengaturan yang lebih tinggi akan membuat Valgrind berjalan
sedikit lebih lambat dan membutuhkan lebih banyak memori, tetapi dapat berguna saat bekerja dengan
program dengan rantai panggilan bersarang dalam.
--unw-stack-scan-thresh= [bawaan: 0] , --unw-stack-scan-frames= [bawaan:
5]
Dukungan pemindaian tumpukan hanya tersedia pada target ARM.
Bendera ini mengaktifkan dan mengontrol pelepasan tumpukan dengan pemindaian tumpukan. Ketika biasa
mekanisme pelepasan tumpukan -- penggunaan catatan CFI Dwarf, dan penunjuk bingkai mengikuti
-- gagal, pemindaian tumpukan mungkin dapat memulihkan jejak tumpukan.
Perhatikan bahwa pemindaian tumpukan adalah mekanisme heuristik yang tidak tepat yang dapat memberikan
hasil yang menyesatkan, atau tidak ada sama sekali. Itu harus digunakan hanya dalam keadaan darurat, ketika normal
pelepasan gagal, dan tetap penting untuk memiliki jejak tumpukan.
Pemindaian tumpukan adalah teknik sederhana: pengurai membaca kata-kata dari tumpukan, dan
mencoba menebak yang mana dari mereka yang mungkin merupakan alamat pengirim, dengan memeriksa untuk melihat apakah mereka
arahkan tepat setelah instruksi panggilan ARM atau Thumb. Jika demikian, kata tersebut ditambahkan ke
mundur.
Bahaya utama terjadi ketika panggilan fungsi kembali, meninggalkan alamat pengirimnya
terbuka, dan fungsi baru dipanggil, tetapi fungsi baru tidak menimpa yang lama
alamat. Hasilnya adalah backtrace mungkin berisi entri untuk fungsi
yang sudah kembali, dan jadi sangat membingungkan.
Keterbatasan kedua dari implementasi ini adalah hanya akan memindai halaman (4KB,
biasanya) yang berisi penunjuk tumpukan awal. Jika bingkai tumpukan besar, ini
dapat mengakibatkan hanya sedikit (atau bahkan tidak ada) yang ada dalam jejak. Juga, jika Anda
tidak beruntung dan memiliki penunjuk tumpukan awal di dekat akhir halaman yang berisi, the
scan mungkin kehilangan semua frame yang menarik.
Secara default, pemindaian tumpukan dinonaktifkan. Kasus penggunaan normal adalah memintanya ketika
jejak tumpukan sebaliknya akan sangat pendek. Jadi, untuk mengaktifkannya, gunakan
--unw-stack-scan-thresh=number. Ini meminta Valgrind untuk mencoba menggunakan pemindaian tumpukan untuk
"perpanjang" tumpukan jejak yang berisi lebih sedikit dari bingkai angka.
Jika pemindaian tumpukan terjadi, itu hanya akan menghasilkan paling banyak jumlah bingkai
ditentukan oleh --unw-stack-scan-frames. Biasanya, pemindaian tumpukan menghasilkan begitu banyak
entri sampah yang nilai ini disetel ke nilai rendah (5) secara default. Dalam hal apapun tidak akan
jejak tumpukan lebih besar dari nilai yang ditentukan oleh --num-callers dibuat.
--error-limit= [bawaan: Ya]
Saat diaktifkan, Valgrind berhenti melaporkan kesalahan setelah total 10,000,000, atau 1,000
yang berbeda, telah terlihat. Ini untuk menghentikan mesin pelacak kesalahan dari
menjadi overhead kinerja besar dalam program dengan banyak kesalahan.
--error-exitcode= [bawaan: 0]
Menentukan kode keluar alternatif untuk dikembalikan jika Valgrind melaporkan kesalahan apa pun di
Lari. Ketika diatur ke nilai default (nol), nilai kembalian dari Valgrind akan selalu
menjadi nilai kembali dari proses yang disimulasikan. Ketika diatur ke nilai bukan nol, itu
nilai dikembalikan sebagai gantinya, jika Valgrind mendeteksi kesalahan apa pun. Ini berguna untuk menggunakan
Valgrind sebagai bagian dari rangkaian pengujian otomatis, karena memudahkan untuk mendeteksi pengujian
kasus di mana Valgrind telah melaporkan kesalahan, hanya dengan memeriksa kode pengembalian.
--penanda kesalahan= , [bawaan: tidak ada]
Ketika kesalahan ditampilkan sebagai teks biasa (yaitu XML tidak digunakan), --penanda kesalahan menginstruksikan untuk
menghasilkan baris yang berisi mulai (akhir) string sebelum (setelah) setiap kesalahan.
Garis penanda tersebut memfasilitasi pencarian kesalahan dan/atau penggalian kesalahan dalam
file output yang berisi kesalahan valgrind dicampur dengan output program.
Perhatikan bahwa penanda kosong diterima. Jadi, hanya menggunakan penanda awal (atau akhir) adalah
mungkin.
--sigill-diagnostics= [bawaan: Ya]
Mengaktifkan/menonaktifkan pencetakan diagnostik instruksi ilegal. Diaktifkan secara default, tapi
default untuk dinonaktifkan ketika --diam diberikan. Defaultnya selalu bisa secara eksplisit
ditimpa dengan memberikan opsi ini.
Saat diaktifkan, pesan peringatan akan dicetak, bersama dengan beberapa diagnostik, kapan saja
sebuah instruksi ditemui bahwa Valgrind tidak dapat memecahkan kode atau menerjemahkan, sebelum
program diberi sinyal SIGILL. Seringkali instruksi ilegal menunjukkan bug di
program atau dukungan yang hilang untuk instruksi tertentu di Valgrind. Tetapi beberapa
program memang sengaja mencoba mengeksekusi instruksi yang mungkin hilang dan menjebak
sinyal SIGILL untuk mendeteksi fitur prosesor. Menggunakan bendera ini memungkinkan untuk
hindari keluaran diagnostik yang seharusnya Anda dapatkan dalam kasus seperti itu.
--tampilkan-bawah-utama= [bawaan: tidak]
Secara default, pelacakan tumpukan untuk kesalahan tidak menampilkan fungsi apa pun yang muncul di bawah utama
karena sebagian besar waktu itu hal-hal perpustakaan C yang tidak menarik dan/atau gobbledygook.
Atau, jika utama tidak ada dalam jejak tumpukan, jejak tumpukan tidak akan ditampilkan
fungsi apa pun di bawah ini: utama-seperti fungsi seperti glibc's __libc_start_main.
Selanjutnya, jika utama-fungsi seperti hadir dalam jejak, mereka dinormalisasi sebagai
(di bawah utama), untuk membuat output lebih deterministik.
Jika opsi ini diaktifkan, semua entri pelacakan tumpukan akan ditampilkan dan utama-seperti
fungsi tidak akan dinormalisasi.
--fullpath-after= [bawaan: tidak Menunjukkan sumber jalan]
Secara default, Valgrind hanya menampilkan nama file dalam jejak tumpukan, tetapi bukan jalur lengkap ke
file sumber. Saat menggunakan Valgrind dalam proyek besar di mana sumbernya berada
beberapa direktori yang berbeda, ini bisa merepotkan. --fullpath-setelah menyediakan
solusi fleksibel untuk masalah ini. Saat opsi ini ada, jalur ke masing-masing
file sumber ditampilkan, dengan peringatan penting berikut: if string ditemukan di
jalan, lalu jalan ke dan termasuk string dihilangkan, jika tidak jalan akan ditampilkan
tidak dimodifikasi. Perhatikan bahwa string tidak diperlukan untuk menjadi awalan jalan.
Misalnya, pertimbangkan file bernama /home/janedoe/blah/src/foo/bar/xyzzy.c. Menentukan
--fullpath-after=/home/janedoe/bla/src/ akan menyebabkan Valgrind menunjukkan nama sebagai
foo/bar/xyzzy.c.
Karena string tidak diharuskan menjadi awalan, --fullpath-setelah=src/ akan menghasilkan
keluaran yang sama. Ini berguna ketika jalur berisi arbitrer yang dihasilkan mesin
karakter. Misalnya, jalur /my/build/dir/C32A1B47/blah/src/foo/xyzzy dapat berupa
dipangkas menjadi foo/xyzzy menggunakan --fullpath-after=/bla/src/.
Jika Anda hanya ingin melihat path lengkap, cukup tentukan string kosong:
--fullpath-setelah=. Ini bukan kasus khusus, hanya konsekuensi logis dari
aturan di atas.
Akhirnya, Anda dapat menggunakan --fullpath-setelah beberapa kali. Setiap kemunculannya menyebabkan
Valgrind untuk beralih ke produksi jalur lengkap dan menerapkan aturan pemfilteran di atas. Setiap
jalur yang dihasilkan dibandingkan dengan semua --fullpath-setelahstring -ditentukan, di
pesanan yang ditentukan. String pertama yang cocok menyebabkan jalur terpotong sebagai
dijelaskan di atas. Jika tidak ada yang cocok, jalur lengkap akan ditampilkan. Ini memfasilitasi pemotongan
awalan ketika sumber diambil dari sejumlah direktori yang tidak terkait.
--extra-debuginfo-path= [bawaan: tidak terdefinisi dan tidak terpakai]
Secara default, Valgrind mencari di beberapa jalur terkenal untuk objek debug, seperti
/usr/lib/debug/.
Namun, mungkin ada skenario di mana Anda mungkin ingin meletakkan objek debug di
lokasi sewenang-wenang, seperti penyimpanan eksternal saat menjalankan Valgrind di perangkat seluler
dengan penyimpanan lokal yang terbatas. Contoh lain mungkin situasi di mana Anda tidak memiliki
izin untuk menginstal paket objek debug pada sistem tempat Anda menjalankan
Valgrid.
Dalam skenario ini, Anda dapat memberikan jalur absolut sebagai tempat terakhir tambahan untuk
Valgrind untuk mencari objek debug dengan menentukan
--extra-debuginfo-path=/path/ke/debug/objects. Jalur yang diberikan akan didahului ke
nama path absolut dari objek yang dicari. Misalnya, jika Valgrind mencari
debuginfo untuk /w/x/y/zz.so dan --ekstra-debuginfo-path=/a/b/c ditentukan, itu akan
cari objek debug di /a/b/c/w/x/y/zz.so.
Bendera ini hanya boleh ditentukan sekali. Jika ditentukan beberapa kali, hanya
contoh terakhir dihormati.
--debuginfo-server=ipaddr:pelabuhan [bawaan: tidak terdefinisi dan tidak terpakai]
Ini adalah fitur eksperimental baru yang diperkenalkan di versi 3.9.0.
Dalam beberapa skenario mungkin lebih mudah untuk membaca debuginfo dari objek yang disimpan di a
mesin yang berbeda. Dengan bendera ini, Valgrind akan menanyakan server debuginfo yang berjalan di
ipaddr dan mendengarkan di port port, jika tidak dapat menemukan objek debuginfo di lokal
berkas sistem.
Server debuginfo harus menerima koneksi TCP pada port port. Server debuginfo adalah
terkandung dalam file sumber auxprogs/valgrind-di-server.c. Itu hanya akan melayani dari
direktori tempat dimulainya. port default ke 1500 di klien dan server jika
tidak ditentukan.
Jika Valgrind mencari debuginfo untuk /w/x/y/zz.so dengan menggunakan server debuginfo, itu
akan menghapus komponen pathname dan hanya meminta zz.so di server. Itu di
turn hanya akan melihat di direktori kerjanya saat ini untuk objek debuginfo yang cocok.
Data debuginfo ditransmisikan dalam fragmen kecil (8 KB) seperti yang diminta oleh Valgrind.
Setiap blok dikompresi menggunakan LZO untuk mengurangi waktu transmisi. Implementasi memiliki
telah disetel untuk kinerja terbaik melalui tautan jaringan 802.11g (WiFi) satu tahap.
Perhatikan bahwa memeriksa pencocokan objek primer vs debug, menggunakan GNU debuglink CRC
skema, dilakukan bahkan saat menggunakan server debuginfo. Untuk menonaktifkan pemeriksaan tersebut,
anda juga perlu menentukan --allow-mismatched-debuginfo=yes.
Secara default sistem build Valgrind akan membangun valgrind-di-server untuk target
platform, yang hampir pasti bukan yang Anda inginkan. Sejauh ini kami tidak dapat
cari tahu cara mendapatkan automake/autoconf untuk membangunnya untuk platform build. jika kamu mau
untuk menggunakannya, Anda harus mengkompilasi ulang dengan tangan menggunakan perintah yang ditunjukkan di atas
auxprogs/valgrind-di-server.c.
--allow-mismatched-debuginfo=tidak|ya [tidak]
Saat membaca debuginfo dari objek debuginfo terpisah, Valgrind secara default akan memeriksa
bahwa objek utama dan debuginfo cocok, menggunakan mekanisme tautan debug GNU. Ini
menjamin bahwa itu tidak membaca debuginfo dari objek debuginfo yang kedaluwarsa, dan
juga memastikan bahwa Valgrind tidak bisa crash karena ketidakcocokan.
Pemeriksaan ini dapat diganti menggunakan --allow-mismatched-debuginfo=yes. Ini mungkin
berguna ketika debuginfo dan objek utama belum dipisah dengan cara yang benar. Menjadi
hati-hati saat menggunakan ini, meskipun: itu menonaktifkan semua pemeriksaan konsistensi, dan Valgrind
telah diamati mogok ketika objek utama dan debuginfo tidak cocok.
--penekanan= [bawaan: $PREFIX/lib/valgrind/default.supp]
Menentukan file tambahan untuk membaca deskripsi kesalahan untuk ditekan. Kamu boleh
gunakan hingga 100 file supresi tambahan.
--gen-penekanan= [bawaan: tidak]
Saat diatur ke iya nih, Valgrind akan berhenti sejenak setelah setiap kesalahan ditampilkan dan mencetak baris:
---- Penindasan cetak? --- [Kembali/T/n/Y/y/C/c] ----
Mendesak penolakan, atau N penolakan or n penolakan, menyebabkan Valgrind melanjutkan eksekusi tanpa mencetak
penindasan untuk kesalahan ini.
Mendesak Y penolakan or y penolakan menyebabkan Valgrind menulis penekanan untuk kesalahan ini. Kamu bisa
lalu potong dan tempel ke file supresi jika Anda tidak ingin mendengar tentang
kesalahan di masa depan.
Saat diatur ke semua, Valgrind akan mencetak penindasan untuk setiap kesalahan yang dilaporkan, tanpa
menanyakan pengguna.
Opsi ini sangat berguna dengan program C++, karena akan mencetak
penindasan dengan nama yang rusak, sesuai kebutuhan.
Perhatikan bahwa penekanan yang dicetak sespesifik mungkin. Anda mungkin ingin bersama
up yang serupa, dengan menambahkan wildcard ke nama fungsi, dan dengan menggunakan frame-level
wildcard. Fasilitas wildcarding kuat namun fleksibel, dan dengan sedikit
pengeditan hati-hati, Anda mungkin dapat menekan seluruh keluarga kesalahan terkait dengan
hanya beberapa penindasan.
Terkadang dua kesalahan berbeda ditekan oleh penekanan yang sama, dalam hal ini
Valgrind akan mengeluarkan penindasan lebih dari sekali, tetapi Anda hanya perlu memilikinya
salin di file penindasan Anda (tetapi memiliki lebih dari satu tidak akan menimbulkan masalah). Juga,
nama penindasan diberikan sebagai ; namanya tidak
sangat penting, itu hanya digunakan dengan -v opsi yang mencetak semua penekanan yang digunakan
Catatan.
--input-fd= [bawaan: 0, stdin]
Ketika menggunakan --gen-supresi=ya, Valgrind akan berhenti untuk membaca input keyboard
dari Anda ketika setiap kesalahan terjadi. Secara default membaca dari input standar (stdin),
yang bermasalah untuk program yang menutup stdin. Opsi ini memungkinkan Anda untuk menentukan
deskriptor file alternatif untuk membaca input.
--dsymutil=tidak|ya [Iya]
Opsi ini hanya relevan saat menjalankan Valgrind di Mac OS X.
Mac OS X menggunakan skema penautan informasi debug (debuginfo) yang ditangguhkan. Ketika objek
file yang berisi debuginfo ditautkan ke .dylib atau executable, debuginfo adalah
tidak disalin ke file akhir. Sebagai gantinya, debuginfo harus ditautkan secara manual dengan
menjalankan dsymutil, utilitas yang disediakan sistem, pada file yang dapat dieksekusi atau .dylib. NS
debuginfo gabungan yang dihasilkan ditempatkan di direktori di samping file yang dapat dieksekusi atau
.dylib, tetapi dengan ekstensi .dSYM.
Dengan --dsymutil=tidak, Valgrind akan mendeteksi kasus di mana direktori .dSYM berada
hilang, atau ada tetapi tampaknya tidak cocok dengan executable terkait atau
.dylib, kemungkinan besar karena sudah ketinggalan zaman. Dalam kasus ini, Valgrind akan mencetak
pesan peringatan tetapi tidak mengambil tindakan lebih lanjut.
Dengan --dsymutil=ya, Valgrind akan, dalam kasus seperti itu, secara otomatis menjalankan dsymutil sebagai
diperlukan untuk memperbarui debuginfo. Untuk semua tujuan praktis, jika Anda selalu
menggunakan --dsymutil=ya, maka tidak perlu menjalankan dsymutil secara manual atau sebagai bagian
sistem pembangunan aplikasi Anda, karena Valgrind akan menjalankannya seperlunya.
Valgrind tidak akan mencoba menjalankan dsymutil pada executable atau library apa pun di /usr/,
/ tempat sampah /, / sbin /, /memilih/, /sw/, /System/, /Library/ atau /Applications/ karena dsymutil akan
selalu gagal dalam situasi seperti itu. Gagal keduanya karena debuginfo untuk itu
komponen sistem pra-instal tidak tersedia di mana pun, dan juga karena itu akan
memerlukan hak menulis di direktori tersebut.
Hati-hati saat menggunakan --dsymutil=ya, karena akan menyebabkan .dSYM . yang sudah ada sebelumnya
direktori yang akan dihapus secara diam-diam dan dibuat ulang. Perhatikan juga bahwa dsymutil cukup
lambat, terkadang terlalu berlebihan.
--max-stackframe= [bawaan: 2000000]
Ukuran maksimum bingkai tumpukan. Jika penunjuk tumpukan bergerak lebih dari jumlah ini
kemudian Valgrind akan menganggap bahwa program beralih ke tumpukan yang berbeda.
Anda mungkin perlu menggunakan opsi ini jika program Anda memiliki array alokasi tumpukan yang besar.
Valgrind melacak penunjuk tumpukan program Anda. Jika berubah lebih dari
jumlah ambang batas, Valgrind menganggap program Anda beralih ke tumpukan yang berbeda, dan
Memcheck berperilaku berbeda dari yang akan terjadi pada penunjuk tumpukan yang berubah lebih kecil dari
ambang. Biasanya heuristik ini bekerja dengan baik. Namun, jika program Anda mengalokasikan besar
struktur di tumpukan, heuristik ini akan tertipu, dan Memcheck selanjutnya akan
melaporkan sejumlah besar akses tumpukan yang tidak valid. Opsi ini memungkinkan Anda untuk mengubah
ambang ke nilai yang berbeda.
Anda hanya boleh mempertimbangkan penggunaan opsi ini jika output debug Valgrind mengarahkan Anda ke
melakukannya. Dalam hal ini, ini akan memberi tahu Anda ambang batas baru yang harus Anda tentukan.
Secara umum, mengalokasikan struktur besar pada tumpukan adalah ide yang buruk, karena Anda dapat
mudah kehabisan ruang tumpukan, terutama pada sistem dengan memori terbatas atau yang
berharap untuk mendukung sejumlah besar utas masing-masing dengan tumpukan kecil, dan juga karena
pemeriksaan kesalahan yang dilakukan oleh Memcheck lebih efektif untuk data yang dialokasikan heap
daripada untuk data yang dialokasikan tumpukan. Jika Anda harus menggunakan opsi ini, Anda mungkin ingin
pertimbangkan untuk menulis ulang kode Anda untuk dialokasikan di heap daripada di stack.
--main-stacksize= [bawaan: menggunakan arus 'batas' nilai]
Menentukan ukuran tumpukan utas utama.
Untuk menyederhanakan manajemen memorinya, Valgrind mencadangkan semua ruang yang diperlukan untuk main
tumpukan utas saat startup. Itu berarti perlu mengetahui ukuran tumpukan yang diperlukan di
startup
Secara default, Valgrind menggunakan nilai "ulimit" saat ini untuk ukuran tumpukan, atau 16 MB,
mana yang lebih rendah. Dalam banyak kasus ini memberikan ukuran tumpukan dalam kisaran 8 hingga 16 MB,
yang hampir tidak pernah meluap untuk sebagian besar aplikasi.
Jika Anda membutuhkan ukuran tumpukan total yang lebih besar, gunakan --ukuran tumpukan utama untuk menentukannya. Hanya mengaturnya
setinggi yang Anda butuhkan, karena memesan lebih banyak ruang daripada yang Anda butuhkan (yaitu, ratusan
megabyte lebih dari yang Anda butuhkan) membatasi pengalokasi memori Valgrind dan mungkin
mengurangi jumlah total memori yang dapat digunakan Valgrind. Ini hanya benar-benar dari
signifikan pada mesin 32-bit.
Di Linux, Anda dapat meminta tumpukan ukuran hingga 2GB. Valgrind akan berhenti dengan
pesan diagnostik jika tumpukan tidak dapat dialokasikan.
--ukuran tumpukan utama hanya mempengaruhi ukuran tumpukan untuk utas awal program. Memiliki
tidak ada kaitannya dengan ukuran tumpukan benang, karena Valgrind tidak mengalokasikannya.
Anda mungkin perlu menggunakan keduanya --ukuran tumpukan utama dan --max-stackframe bersama. Dia
penting untuk memahami itu --ukuran tumpukan utama menetapkan ukuran tumpukan total maksimum,
sementara --max-stackframe menentukan ukuran terbesar dari salah satu bingkai tumpukan. Kamu akan
harus mengerjakan --ukuran tumpukan utama nilai untuk diri Anda sendiri (biasanya, jika Anda
segfault aplikasi). Tapi Valgrind akan memberitahumu apa yang dibutuhkan --max-stackframe ukuran,
jika perlu.
Seperti yang dibahas lebih lanjut dalam deskripsi --max-stackframe, persyaratan untuk besar
stack adalah tanda potensi masalah portabilitas. Anda disarankan untuk menempatkan semua
data besar dalam memori yang dialokasikan heap.
--max-benang= [bawaan: 500]
Secara default, Valgrind dapat menangani hingga 500 utas. Kadang-kadang, nomor itu juga
kecil. Gunakan opsi ini untuk memberikan batas yang berbeda. Misalnya --max-utas=3000.
MALLOC()-TERKAIT PILIHAN
Untuk alat yang menggunakan versi malloc mereka sendiri (misalnya Memcheck, Massif, Helgrind, DRD), the
opsi berikut berlaku.
--alignment= [bawaan: 8 or 16, tergantung on itu peron]
Secara default Valgrind's malloc, mengalokasikan kembali, dll, kembalikan blok yang alamat awalnya adalah
8-byte selaras atau 16-byte selaras (nilainya tergantung pada platform dan cocok dengan
standar platform). Opsi ini memungkinkan Anda untuk menentukan perataan yang berbeda. NS
nilai yang diberikan harus lebih besar dari atau sama dengan default, kurang dari atau sama dengan
4096, dan harus pangkat dua.
--redzone-size= [bawaan: tergantung on itu alat]
Valgrind malloc, mengalokasikan kembali, dll, tambahkan blok bantalan sebelum dan sesudah setiap blok tumpukan
dialokasikan oleh program yang dijalankan. Blok padding seperti itu disebut zona merah. NS
nilai default untuk ukuran zona merah tergantung pada alat. Misalnya, Memcheck menambahkan dan
melindungi minimal 16 byte sebelum dan sesudah setiap blok yang dialokasikan oleh klien.
Hal ini memungkinkan untuk mendeteksi blok underruns atau overruns hingga 16 byte.
Meningkatkan ukuran zona merah memungkinkan untuk mendeteksi overruns dari jarak yang lebih besar,
tetapi meningkatkan jumlah memori yang digunakan oleh Valgrind. Mengurangi ukuran zona merah akan
mengurangi memori yang dibutuhkan oleh Valgrind tetapi juga mengurangi kemungkinan mendeteksi
over/underruns, jadi tidak disarankan.
LUAR BIASA PILIHAN
Opsi ini berlaku untuk semua alat, karena memengaruhi cara kerja Valgrind tertentu yang tidak jelas
inti. Kebanyakan orang tidak perlu menggunakannya.
--smc-cek= [bawaan: semua-non-file untuk x86/amd64/s390x,
tumpukan untuk lain lengkungan]
Opsi ini mengontrol deteksi Valgrind terhadap kode modifikasi diri. Jika tidak ada pemeriksaan adalah
selesai, ketika sebuah program mengeksekusi beberapa kode, kemudian menimpanya dengan kode baru, dan
mengeksekusi kode baru, Valgrind akan terus mengeksekusi terjemahan yang dibuatnya
kode lama. Ini kemungkinan akan menyebabkan perilaku yang salah dan/atau crash.
Untuk arsitektur "modern" -- apapun yang bukan x86, amd64 atau s390x -- defaultnya
is tumpukan. Ini karena program yang benar harus mengambil tindakan eksplisit untuk membangun kembali
Koherensi cache DI mengikuti modifikasi kode. Valgrind mengamati dan menghormati seperti itu
tindakan, dengan hasil bahwa kode modifikasi diri ditangani secara transparan dengan nol
biaya tambahan.
Untuk x86, amd64 dan s390x, program tidak perlu memberi tahu perangkat keras tentang
diperlukan sinkronisasi koherensi DI. Oleh karena itu defaultnya adalah semua-non-file, yang mencakup
kasus normal menghasilkan kode ke area mmap'd anonim (tidak didukung file).
Arti dari empat pengaturan yang tersedia adalah sebagai berikut. Tidak ada deteksi (tak satupun),
mendeteksi kode yang memodifikasi sendiri pada tumpukan (yang digunakan oleh GCC untuk mengimplementasikan bersarang
fungsi) (tumpukan), mendeteksi kode modifikasi diri di mana-mana (semua), dan mendeteksi
kode modifikasi sendiri di mana saja kecuali dalam pemetaan yang didukung file (semua-non-file).
Berlari dengan semua akan memperlambat Valgrind secara nyata. Berlari dengan tak satupun akan jarang
mempercepat, karena sangat sedikit kode yang dihasilkan secara dinamis di sebagian besar program.
VALGRIND_DISCARD_TRANSLATIONS permintaan klien adalah alternatif untuk --smc-periksa=semua
dan --smc-check=semua-non-berkas yang membutuhkan lebih banyak upaya programmer tetapi memungkinkan Valgrind
untuk menjalankan program Anda lebih cepat, dengan memberi tahu secara tepat kapan terjemahan perlu dilakukan
dibuat ulang.
--smc-check=semua-non-berkas menyediakan versi yang lebih murah tetapi lebih terbatas dari
--smc-periksa=semua. Itu menambahkan cek ke terjemahan apa pun yang tidak berasal dari
pemetaan memori yang didukung file. Aplikasi khas yang menghasilkan kode, misalnya JIT
di browser web, buat kode ke area pemetaan anonim, sedangkan kode "tetap"
browser selalu hidup dalam pemetaan yang didukung file. --smc-check=semua-non-berkas Dibutuhkan
keuntungan dari pengamatan ini, membatasi overhead pemeriksaan ke kode yang
kemungkinan akan dihasilkan JIT.
--read-inline-info= [bawaan: melihat di bawah]
Saat diaktifkan, Valgrind akan membaca informasi tentang panggilan fungsi sebaris dari DWARF3
informasi debug. Ini memperlambat startup Valgrind dan membuatnya menggunakan lebih banyak memori (biasanya untuk
setiap potongan kode sebaris, 6 kata dan spasi untuk nama fungsi), tetapi hasilnya
dalam stacktrace yang lebih deskriptif. Untuk rilis 3.10.0, fungsi ini diaktifkan
secara default hanya untuk target Linux, Android dan Solaris dan hanya untuk alat
Memcheck, Helgrind dan DRD. Berikut adalah contoh beberapa stacktrace dengan
--read-inline-info=tidak:
==15380== Lompatan atau gerakan bersyarat bergantung pada nilai yang tidak diinisialisasi
==15380== di 0x80484EA: utama (inlinfo.c:6)
=15380==
==15380== Lompatan atau gerakan bersyarat bergantung pada nilai yang tidak diinisialisasi
==15380== pada 0x8048550: fun_noninline (inlinfo.c:6)
==15380== oleh 0x804850E: utama (inlinfo.c:34)
=15380==
==15380== Lompatan atau gerakan bersyarat bergantung pada nilai yang tidak diinisialisasi
==15380== di 0x8048520: utama (inlinfo.c:6)
Dan ini adalah kesalahan yang sama dengan --read-inline-info=ya:
==15377== Lompatan atau gerakan bersyarat bergantung pada nilai yang tidak diinisialisasi
==15377== di 0x80484EA: fun_d (inlinfo.c:6)
==15377== oleh 0x80484EA: fun_c (inlinfo.c:14)
==15377== oleh 0x80484EA: fun_b (inlinfo.c:20)
==15377== oleh 0x80484EA: fun_a (inlinfo.c:26)
==15377== oleh 0x80484EA: main (inlinfo.c:33)
=15377==
==15377== Lompatan atau gerakan bersyarat bergantung pada nilai yang tidak diinisialisasi
==15377== pada 0x8048550: fun_d (inlinfo.c:6)
==15377== oleh 0x8048550: fun_noninline (inlinfo.c:41)
==15377== oleh 0x804850E: utama (inlinfo.c:34)
=15377==
==15377== Lompatan atau gerakan bersyarat bergantung pada nilai yang tidak diinisialisasi
==15377== pada 0x8048520: fun_d (inlinfo.c:6)
==15377== oleh 0x8048520: main (inlinfo.c:35)
--read-var-info= [bawaan: tidak]
Saat diaktifkan, Valgrind akan membaca informasi tentang tipe variabel dan lokasi dari
Info debug DWARF3. Ini memperlambat startup Valgrind secara signifikan dan membuatnya berguna
lebih banyak memori secara signifikan, tetapi untuk alat yang dapat memanfaatkannya (Memcheck,
Helgrind, DRD) dapat menghasilkan pesan kesalahan yang lebih tepat. Misalnya, di sini adalah
beberapa kesalahan standar yang dikeluarkan oleh Memcheck:
==15363== Byte yang tidak diinisialisasi ditemukan selama permintaan pemeriksaan klien
==15363== pada 0x80484A9: croak (varinfo1.c:28)
==15363== oleh 0x8048544: main (varinfo1.c:55)
==15363== Alamat 0x80497f7 adalah 7 byte di dalam simbol data "global_i2"
=15363==
==15363== Byte yang tidak diinisialisasi ditemukan selama permintaan pemeriksaan klien
==15363== pada 0x80484A9: croak (varinfo1.c:28)
==15363== oleh 0x8048550: main (varinfo1.c:56)
==15363== Alamat 0xbea0d0cc ada di tumpukan utas 1
==15363== dalam bingkai #1, dibuat oleh main (varinfo1.c:45)
Dan ini adalah kesalahan yang sama dengan --read-var-info=ya:
==15370== Byte yang tidak diinisialisasi ditemukan selama permintaan pemeriksaan klien
==15370== pada 0x80484A9: croak (varinfo1.c:28)
==15370== oleh 0x8048544: main (varinfo1.c:55)
==15370== Lokasi 0x80497f7 adalah 0 byte di dalam global_i2[7],
==15370== variabel global yang dideklarasikan di varinfo1.c:41
=15370==
==15370== Byte yang tidak diinisialisasi ditemukan selama permintaan pemeriksaan klien
==15370== pada 0x80484A9: croak (varinfo1.c:28)
==15370== oleh 0x8048550: main (varinfo1.c:56)
==15370== Lokasi 0xbeb4a0cc adalah 0 byte di dalam var lokal "lokal"
==15370== dideklarasikan di varinfo1.c:46, di bingkai #1 dari utas 1
--vgdb-polling= [bawaan: 5000]
Sebagai bagian dari putaran utamanya, penjadwal Valgrind akan melakukan polling untuk memeriksa apakah ada aktivitas
(seperti perintah eksternal atau beberapa masukan dari gdb) harus ditangani oleh gdbserver.
Polling aktivitas ini akan dilakukan setelah menjalankan sejumlah blok dasar (atau
sedikit lebih banyak dari jumlah blok dasar yang diberikan). Polling ini cukup murah jadi
nilai default diatur relatif rendah. Anda dapat mengurangi nilai ini lebih lanjut jika vgdb
tidak dapat menggunakan panggilan sistem ptrace untuk menginterupsi Valgrind jika semua utasnya (sebagian besar)
waktu) diblokir dalam panggilan sistem.
--vgdb-shadow-registers=tidak|ya [bawaan: tidak]
Saat diaktifkan, gdbserver akan mengekspos register bayangan Valgrind ke GDB. Dengan ini,
nilai register bayangan Valgrind dapat diperiksa atau diubah menggunakan GDB.
Mengekspos register bayangan hanya berfungsi dengan GDB versi 7.1 atau yang lebih baru.
--vgdb-prefix= [bawaan: /tmp/vgdb-pipa]
Untuk berkomunikasi dengan gdb/vgdb, gdbserver Valgrind membuat 3 file (2 bernama FIFO
dan file memori bersama mmap). Opsi awalan mengontrol direktori dan awalan
untuk pembuatan file-file ini.
--run-libc-freeres= [bawaan: Ya]
Opsi ini hanya relevan saat menjalankan Valgrind di Linux.
Pustaka GNU C (libc.so), yang digunakan oleh semua program, dapat mengalokasikan memori untuk
kegunaannya sendiri. Biasanya tidak perlu repot untuk mengosongkan memori itu saat program berakhir—
tidak akan ada gunanya, karena kernel Linux mengambil kembali semua sumber daya proses ketika a
proses tetap keluar, jadi itu hanya akan memperlambat segalanya.
Penulis glibc menyadari bahwa perilaku ini menyebabkan pemeriksa kebocoran, seperti Valgrind,
untuk melaporkan kebocoran di glibc secara salah, saat pemeriksaan kebocoran dilakukan di pintu keluar. Untuk menghindari
ini, mereka menyediakan rutinitas yang disebut __libc_freeres khusus untuk membuat rilis glibc
semua memori yang telah dialokasikan. Karena itu Memcheck mencoba menjalankan __libc_freeres di pintu keluar.
Sayangnya, di beberapa versi glibc yang sangat lama, __libc_freeres sudah cukup
buggy untuk menyebabkan kesalahan segmentasi. Ini terutama terlihat pada Red Hat 7.1.
Jadi opsi ini disediakan untuk menghambat jalannya __libc_freeres. Jika Anda
program tampaknya berjalan dengan baik di Valgrind, tetapi segfaults saat keluar, Anda mungkin menemukan itu
--run-libc-freeres=tidak memperbaikinya, meskipun dengan kemungkinan pelaporan yang salah
kebocoran ruang di libc.so.
--sim-hints=petunjuk1,petunjuk2,...
Berikan petunjuk lain-lain ke Valgrind yang sedikit mengubah perilaku simulasi di
cara yang tidak standar atau berbahaya, mungkin untuk membantu simulasi fitur aneh. Oleh
default tidak ada petunjuk yang diaktifkan. Gunakan dengan hati-hati! Petunjuk yang diketahui saat ini adalah:
· longgar-ioctls: Sangat longgar tentang penanganan ioctl; satu-satunya asumsi adalah bahwa ukurannya
benar. Tidak memerlukan buffer penuh untuk diinisialisasi saat menulis.
Tanpa ini, menggunakan beberapa driver perangkat dengan sejumlah besar ioctl . aneh
perintah menjadi sangat melelahkan.
· kompatibel dengan sekering: Aktifkan penanganan khusus untuk panggilan sistem tertentu yang mungkin memblokir
dalam sistem file FUSE. Ini mungkin diperlukan saat menjalankan Valgrind di
program multi-utas yang menggunakan satu utas untuk mengelola sistem file FUSE dan
utas lain untuk mengakses sistem file itu.
· aktifkan-luar: Aktifkan beberapa sihir khusus yang diperlukan saat program sedang dijalankan
itu sendiri Valgrind.
· awalan tanpa-dalam: Nonaktifkan pencetakan awalan > di depan setiap stdout atau stderr
jalur output di Valgrind dalam yang dijalankan oleh Valgrind luar. Ini berguna
saat menjalankan tes regresi Valgrind di pengaturan luar/dalam. Perhatikan bahwa
awalan > akan selalu dicetak di depan baris debug logging bagian dalam.
· tanpa-nptl-pthread-stackcache: Petunjuk ini hanya relevan saat menjalankan Valgrind pada
Linux.
Pustaka pthread GNU glibc (libpthread.so), yang digunakan oleh program pthread,
memelihara cache dari tumpukan pthread. Ketika pthread berakhir, memori yang digunakan
untuk tumpukan pthread dan beberapa struktur data terkait penyimpanan lokal tidak
selalu langsung dirilis. Memori ini disimpan dalam cache (hingga ukuran tertentu),
dan digunakan kembali jika utas baru dimulai.
Cache ini menyebabkan alat helgrind melaporkan beberapa kondisi balapan positif palsu
kesalahan pada memori yang di-cache ini, karena helgrind tidak memahami glibc internal
primitif sinkronisasi cache. Jadi, saat menggunakan helgrind, nonaktifkan cache
membantu menghindari kondisi balapan positif palsu, khususnya saat menggunakan utas
variabel penyimpanan lokal (misalnya variabel menggunakan __benang kualifikasi).
Saat menggunakan alat memcheck, menonaktifkan cache memastikan memori yang digunakan oleh glibc
untuk menangani variabel __thread dilepaskan secara langsung ketika sebuah utas berakhir.
Catatan: Valgrind menonaktifkan cache menggunakan beberapa pengetahuan internal tentang tumpukan glibc
implementasi cache dan dengan memeriksa informasi debug pthread
Perpustakaan. Dengan demikian, teknik ini agak rapuh dan mungkin tidak bekerja untuk semua glibc
versi. Ini telah berhasil diuji dengan berbagai versi glibc (mis
2.11, 2.16, 2.18) di berbagai platform.
· pintu longgar: (Khusus Solaris) Berhati-hatilah dalam menangani syscall pintu
deskriptor file pintu yang tidak dikenal. Tidak memerlukan buffer penuh adalah
diinisialisasi saat menulis. Tanpa ini, program menggunakan pintu lib(3LIB) fungsionalitas
dengan semantik sepenuhnya berpemilik dapat melaporkan sejumlah besar positif palsu.
--fair-sched= [bawaan: tidak]
--jadwal wajar opsi mengontrol mekanisme penguncian yang digunakan oleh Valgrind untuk membuat serial
eksekusi benang. Mekanisme penguncian mengontrol cara utas dijadwalkan,
dan pengaturan yang berbeda memberikan trade-off yang berbeda antara keadilan dan kinerja. Untuk
lebih detail tentang skema serialisasi utas Valgrind dan dampaknya pada
kinerja dan penjadwalan utas, lihat Penjadwalan dan Kinerja Multi-Utas.
· Nilai --fair-sched=ya mengaktifkan penjadwal yang adil. Singkatnya, jika banyak
utas siap dijalankan, utas akan dijadwalkan secara round robin.
Mekanisme ini tidak tersedia di semua platform atau versi Linux. Jika tidak
tersedia, menggunakan --fair-sched=ya akan menyebabkan Valgrind berakhir dengan kesalahan.
Anda mungkin menemukan pengaturan ini meningkatkan respons keseluruhan jika Anda menjalankan
program multithreaded interaktif, misalnya browser web, di Valgrind.
· Nilai --fair-sched=coba mengaktifkan penjadwalan yang adil jika tersedia di platform.
Jika tidak, secara otomatis akan jatuh kembali ke --fair-sched=tidak.
· Nilai --fair-sched=tidak mengaktifkan penjadwal yang tidak menjamin keadilan
antara utas yang siap dijalankan, tetapi yang secara umum memberikan kinerja tertinggi.
--kernel-varian=varian1,varian2,...
Menangani panggilan sistem dan ioctl yang muncul dari varian minor kernel default untuk
platform ini. Ini berguna untuk dijalankan pada kernel yang diretas atau dengan modul kernel
yang mendukung ioctls tidak standar, misalnya. Gunakan dengan hati-hati. Jika tidak
memahami apa yang dilakukan opsi ini maka Anda hampir pasti tidak membutuhkannya. Saat ini
varian yang diketahui adalah:
· bprok: dukung sys_broc panggilan sistem di x86. Ini untuk berjalan di BPoc,
yang merupakan varian kecil dari Linux standar yang terkadang digunakan untuk membangun
kelompok.
· android-no-hw-tls: beberapa versi emulator Android untuk ARM tidak menyediakan
perangkat keras TLS (negara utas-lokal) mendaftar, dan Valgrind lumpuh saat startup. Menggunakan
varian ini untuk memilih dukungan perangkat lunak untuk TLS.
· android-gpu-sgx5xx: gunakan ini untuk mendukung penanganan ioctls berpemilik untuk
PowerVR SGX 5XX seri GPU pada perangkat Android. Kegagalan untuk memilih ini tidak
menyebabkan masalah stabilitas, tetapi dapat menyebabkan Memcheck melaporkan kesalahan palsu setelah
program melakukan ioctls khusus GPU.
· android-gpu-adreno3xx: sama, gunakan ini untuk mendukung penanganan kepemilikan
ioctls untuk seri GPU Qualcomm Adreno 3XX di perangkat Android.
--merge-recursive-frames= [bawaan: 0]
Beberapa algoritma rekursif, misalnya implementasi pohon biner seimbang, membuat
banyak jejak tumpukan yang berbeda, masing-masing berisi siklus panggilan. Sebuah siklus didefinisikan sebagai
dua nilai penghitung program yang identik dipisahkan oleh nol atau lebih penghitung program lainnya
nilai-nilai. Valgrind kemudian dapat menggunakan banyak memori untuk menyimpan semua jejak tumpukan ini. Ini adalah
penggunaan memori yang buruk mengingat jejak tumpukan tersebut mengandung pengulangan yang tidak menarik
panggilan rekursif alih-alih informasi yang lebih menarik seperti fungsi yang memiliki
memulai panggilan rekursif.
Pilihan --merge-recursive-frames= menginstruksikan Valgrind untuk mendeteksi dan menggabungkan
siklus panggilan rekursif memiliki ukuran hingga bingkai. Ketika siklus seperti itu adalah
terdeteksi, Valgrind mencatat siklus dalam jejak tumpukan sebagai penghitung program yang unik.
Nilai 0 (default) tidak menyebabkan penggabungan panggilan rekursif. Nilai 1 akan menyebabkan
tumpukan jejak algoritma rekursif sederhana (misalnya, implementasi faktorial)
untuk runtuh. Nilai 2 biasanya diperlukan untuk menciutkan jejak tumpukan yang dihasilkan
oleh algoritma rekursif seperti pohon biner, sortir cepat, dll. Nilai yang lebih tinggi mungkin
diperlukan untuk algoritma rekursif yang lebih kompleks.
Catatan: panggilan rekursif dideteksi dengan analisis nilai penghitung program. Mereka tidak
dideteksi dengan melihat nama fungsi.
--num-transtab-sektor= [bawaan: 6 untuk Android platform, 16 untuk semua yang lain]
Valgrind menerjemahkan dan menginstruksikan kode mesin program Anda dalam fragmen-fragmen kecil
(blok dasar). Terjemahan disimpan dalam cache terjemahan yang dibagi
menjadi beberapa bagian (sektor). Jika cache penuh, sektor yang berisi
terjemahan tertua dikosongkan dan digunakan kembali. Jika terjemahan lama ini diperlukan lagi,
Valgrind harus menerjemahkan ulang dan menginstrumentasi ulang kode mesin yang sesuai, yaitu
mahal. Jika set kerja "instruksi yang dieksekusi" dari suatu program besar, meningkat
jumlah sektor dapat meningkatkan kinerja dengan mengurangi jumlah
terjemahan ulang diperlukan. Sektor dialokasikan berdasarkan permintaan. Setelah dialokasikan, suatu sektor dapat
tidak pernah dibebaskan, dan menempati ruang yang cukup besar, tergantung pada alat dan nilainya
of --avg-transtab-ukuran entri (sekitar 40 MB per sektor untuk Memcheck). Gunakan opsi
--stats=ya untuk mendapatkan informasi yang tepat tentang memori yang digunakan oleh suatu sektor dan
alokasi dan daur ulang sektor.
--avg-transtab-entry-size= [bawaan: 0, makna menggunakan alat disediakan bawaan]
Ukuran rata-rata dari blok dasar yang diterjemahkan. Ukuran rata-rata ini digunakan untuk mengukur dimensi
ukuran suatu sektor. Setiap alat memberikan nilai default untuk digunakan. Jika nilai default ini
terlalu kecil, sektor terjemahan akan menjadi penuh terlalu cepat. Jika default ini
nilainya terlalu besar, sebagian besar memori sektor terjemahan tidak akan digunakan.
Perhatikan bahwa ukuran rata-rata terjemahan blok dasar tergantung pada alat, dan mungkin
tergantung pada pilihan alat. Misalnya, opsi memcheck --track-origins=ya meningkat
ukuran terjemahan blok dasar. Menggunakan --avg-transtab-ukuran entri untuk menyetel
ukuran sektor, baik untuk mendapatkan memori atau untuk menghindari terlalu banyak terjemahan ulang.
--aspace-minaddr= [bawaan: tergantung on itu peron]
Untuk menghindari potensi konflik dengan beberapa perpustakaan sistem, Valgrind tidak menggunakan
ruang alamat di bawah --aspace-minaddr nilai, menyimpannya untuk berjaga-jaga jika perpustakaan
secara khusus meminta memori di wilayah ini. Jadi, beberapa nilai "pesimistis" dapat ditebak
oleh Valgrind tergantung pada platformnya. Di linux, secara default, Valgrind menghindari penggunaan
64MB pertama meskipun biasanya tidak ada konflik di zona lengkap ini. Anda dapat gunakan
pilihan --aspace-minaddr agar aplikasi haus memori Anda mendapat manfaat dari
lebih dari memori yang lebih rendah ini. Di sisi lain, jika Anda menghadapi konflik, meningkat
nilai aspace-minaddr mungkin menyelesaikannya. Konflik biasanya akan memanifestasikan dirinya dengan
kegagalan mmap dalam rentang ruang alamat yang rendah. Alamat yang diberikan harus halaman
sejajar dan harus sama atau lebih besar dari 0x1000 (4KB). Untuk menemukan nilai default pada . Anda
platform, lakukan sesuatu seperti valgrind -d -d date 2>&1 | grep -i minaddr. Nilai
lebih rendah dari 0x10000 (64KB) diketahui membuat masalah pada beberapa distribusi.
--valgrind-stacksize= [bawaan: 1 MB]
Untuk setiap utas, Valgrind membutuhkan tumpukan 'pribadi' sendiri. Ukuran default untuk ini
tumpukan sebagian besar berdimensi, dan seharusnya cukup dalam banyak kasus. Jika
ukurannya terlalu kecil, Valgrind akan melakukan segfault. Sebelum segfaulting, peringatan mungkin
dihasilkan oleh Valgrind saat mendekati batas.
Gunakan opsi --valgrind-ukuran tumpukan jika peringatan (tidak mungkin) seperti itu dihasilkan, atau
Valgrind meninggal karena pelanggaran segmentasi. Pelanggaran segmentasi seperti itu telah
terlihat saat membongkar simbol C++ besar.
Jika aplikasi Anda menggunakan banyak utas dan membutuhkan banyak memori, Anda bisa mendapatkan beberapa
memori dengan mengurangi ukuran tumpukan Valgrind ini menggunakan opsi
--valgrind-ukuran tumpukan.
--show-emwarns= [bawaan: tidak]
Saat diaktifkan, Valgrind akan mengeluarkan peringatan tentang emulasi CPU-nya dalam kasus tertentu.
Ini biasanya tidak menarik.
--memerlukan-teks-simbol=:sonamepatt:fnnamepatt
Saat objek bersama yang namanya cocok sonamepatt dimuat ke dalam proses,
periksa semua simbol teks yang diekspornya. Jika tidak ada yang cocok fnnamepatt, cetak dan
pesan kesalahan dan tinggalkan prosesnya. Ini memungkinkan untuk memastikan bahwa lari tidak
tidak melanjutkan kecuali objek bersama yang diberikan berisi nama fungsi tertentu.
Kedua sonamepatt dan fnnamepatt dapat ditulis menggunakan biasa ? dan * wildcard. Untuk
contoh: ":*libc.so*:foo?bar". Anda dapat menggunakan karakter selain titik dua untuk memisahkan
dua pola. Hanya penting bahwa karakter pertama dan pemisah
karakternya sama. Sebagai contoh, contoh di atas juga dapat ditulis
"Q*libc.so*Qfoo?bar". Beberapa
--memerlukan-teks-simbol bendera diperbolehkan, dalam hal ini objek bersama yang dimuat
ke dalam proses akan diperiksa terhadap mereka semua.
Tujuannya adalah untuk mendukung penggunaan perpustakaan mark-up yang andal. Sebagai contoh,
misalkan kita memiliki versi GCC libgomp.so yang telah ditandai dengan
penjelasan untuk mendukung Helgrind. Terlalu mudah dan membingungkan untuk memuat yang salah,
tidak beranotasi libgomp.so ke dalam aplikasi. Jadi idenya adalah: tambahkan simbol teks di
perpustakaan yang ditandai, misalnya dianotasi_untuk_helgrind_3_6, lalu beri bendera
--memerlukan-teks-simbol=:*libgomp*jadi*:annotated_for_helgrind_3_6 sehingga ketika libgomp.so
dimuat, Valgrind memindai tabel simbolnya, dan jika simbol tidak ada, jalankan adalah
dibatalkan, daripada melanjutkan diam-diam dengan perpustakaan yang tidak ditandai. Perhatikan bahwa Anda
harus menempatkan seluruh bendera dalam tanda kutip untuk menghentikan shell yang meluas * dan ?
wildcard.
--soname-synonyms=syn1=pattern1,syn2=pattern2,...
Saat perpustakaan bersama dimuat, Valgrind memeriksa fungsi di perpustakaan yang
harus diganti atau dibungkus. Misalnya, Memcheck menggantikan semua malloc terkait
fungsi (malloc, gratis, calloc, ...) dengan versinya sendiri. Pengganti tersebut adalah
dilakukan secara default hanya di perpustakaan bersama yang sonamenya cocok dengan soname yang telah ditentukan sebelumnya
pola (misalnya libc.jadi* di linux). Secara default, tidak ada penggantian yang dilakukan untuk statis
perpustakaan tertaut atau untuk perpustakaan alternatif seperti tcmalloc. Dalam beberapa kasus,
penggantian memungkinkan --soname-sinonim untuk menentukan satu pola sinonim tambahan, memberikan
fleksibilitas dalam penggantian.
Saat ini, fleksibilitas ini hanya diperbolehkan untuk fungsi terkait malloc, menggunakan
sinonim somalloc. Sinonim ini dapat digunakan untuk semua alat yang melakukan penggantian standar
fungsi terkait malloc (misalnya memcheck, massif, drd, helgrind, exp-dhat,
exp-sgcheck).
· Pustaka malloc alternatif: untuk mengganti fungsi terkait malloc secara bergantian
perpustakaan dengan soname mymalloclib.so, berikan pilihan
--soname-sinonim=somalloc=mymalloclib.so. Sebuah pola dapat digunakan untuk mencocokkan beberapa
perpustakaan sonames. Sebagai contoh, --soname-sinonim=somalloc=*tcmalloc* akan cocok
nama semua varian perpustakaan tcmalloc (asli, debug, diprofilkan, ...
varian tcmalloc).
Catatan: nama perpustakaan bersama elf dapat diambil menggunakan readelf
utilitas
· Penggantian di perpustakaan yang terhubung secara statis dilakukan dengan menggunakan NONE pola.
Misalnya, jika Anda menautkan dengan libtcmalloc.a, memcheck akan berfungsi dengan baik saat Anda
berikan pilihan --soname-sinonim=somalloc=TIDAK ADA. Perhatikan bahwa pola NONE akan
cocok dengan executable utama dan semua perpustakaan bersama yang tidak memiliki soname.
· Untuk menjalankan "default" Firefox build untuk Linux, di mana JEMalloc ditautkan ke
utama yang dapat dieksekusi, gunakan --soname-sinonim=somalloc=TIDAK ADA.
DEBUGING VALGRIND PILIHAN
Ada juga beberapa opsi untuk men-debug Valgrind itu sendiri. Anda tidak perlu menggunakannya
dalam menjalankan hal-hal yang normal. Jika Anda ingin melihat daftarnya, gunakan --bantuan-debug .
MEMPERIKSA PILIHAN
--kebocoran-cek= [bawaan: Ringkasan]
Saat diaktifkan, cari kebocoran memori saat program klien selesai. Jika diatur ke
ringkasan, dikatakan berapa banyak kebocoran yang terjadi. Jika diatur ke penuh or iya nih, setiap kebocoran individu
akan ditampilkan secara rinci dan/atau dihitung sebagai kesalahan, sebagaimana ditentukan oleh opsi
--show-kebocoran-jenis dan --kesalahan-untuk-kebocoran-jenis.
--kebocoran-resolusi= [bawaan: tinggi]
Saat melakukan pemeriksaan kebocoran, tentukan seberapa bersedia Memcheck untuk mempertimbangkan perbedaan
backtrace menjadi sama untuk tujuan menggabungkan beberapa kebocoran menjadi satu
laporan kebocoran. Saat disetel ke rendah, hanya dua entri pertama yang harus cocok. Kapan dengan, Empat
entri harus cocok. Kapan tinggi, semua entri harus cocok.
Untuk debugging kebocoran hardcore, Anda mungkin ingin menggunakan --resolusi kebocoran=tinggi bersama
dengan --jumlah-penelepon=40 atau sejumlah besar seperti itu.
Perhatikan bahwa --resolusi kebocoran pengaturan tidak memengaruhi kemampuan Memcheck untuk menemukan
kebocoran. Itu hanya mengubah bagaimana hasil disajikan.
--show-leak-kinds= [bawaan: pasti, mungkin]
Menentukan jenis kebocoran yang akan ditampilkan di a penuh pencarian kebocoran, dengan salah satu cara berikut:
· daftar dipisahkan koma dari satu atau lebih dari pasti tidak langsung mungkin terjangkau.
· semua untuk menentukan set lengkap (semua jenis kebocoran). Ini setara dengan
--show-leak-kinds=pasti, tidak langsung, mungkin, dapat dijangkau.
· tak satupun untuk himpunan kosong.
--errors-for-leak-kinds= [bawaan: pasti, mungkin]
Menentukan jenis kebocoran untuk dihitung sebagai kesalahan dalam a penuh pencarian kebocoran. NS is
ditentukan mirip dengan --show-kebocoran-jenis
--kebocoran-cek-heuristik= [bawaan: semua]
Menentukan set heuristik pemeriksaan kebocoran yang akan digunakan selama pencarian kebocoran. NS
heuristik mengontrol pointer interior mana ke blok yang menyebabkannya dianggap sebagai
terjangkau. Himpunan heuristik ditentukan dengan salah satu cara berikut:
· daftar dipisahkan koma dari satu atau lebih dari stdstring panjang64 susunan baru
warisan berganda.
· semua untuk mengaktifkan set lengkap heuristik. Ini setara dengan
--leak-check-heuristics=stdstring,length64,newarray,multipleinheritance.
· tak satupun untuk himpunan kosong.
Perhatikan bahwa heuristik ini bergantung pada tata letak objek yang dihasilkan oleh
Kompiler C++. Mereka telah diuji dengan beberapa versi gcc (misalnya 4.4 dan 4.7). Mereka
mungkin tidak berfungsi dengan baik dengan kompiler C++ lainnya.
--show-reachable= , --show-possibly-lost=
Opsi ini memberikan cara alternatif untuk menentukan jenis kebocoran yang akan ditampilkan:
· --show-reachable=tidak --tunjukkan-mungkin-hilang=ya adalah setara dengan
--show-leak-kinds=pasti,mungkin.
· --show-reachable=tidak --show-possibly-lost=tidak adalah setara dengan
--show-leak-kinds=pasti.
· --show-reachable=ya adalah setara dengan --show-leak-kinds=semua.
Perhatikan bahwa --show-possibly-lost=tidak tidak berpengaruh jika --show-reachable=ya ditentukan.
--undef-value-errors= [bawaan: Ya]
Mengontrol apakah laporan Memcheck menggunakan kesalahan nilai yang tidak ditentukan. Setel ini ke tidak if
Anda tidak ingin melihat kesalahan nilai yang tidak ditentukan. Ini juga memiliki efek samping dari ngebut
up Memcheck agak.
--track-origins= [bawaan: tidak]
Mengontrol apakah Memcheck melacak asal nilai yang tidak diinisialisasi. Secara default, itu
tidak, yang berarti bahwa meskipun dapat memberi tahu Anda bahwa nilai yang tidak diinisialisasi adalah
digunakan dengan cara yang berbahaya, itu tidak dapat memberi tahu Anda dari mana nilai yang tidak diinisialisasi itu berasal
dari. Hal ini sering membuat sulit untuk melacak akar masalah.
Saat diatur ke iya nih, Memcheck melacak asal-usul semua nilai yang tidak diinisialisasi.
Kemudian, ketika kesalahan nilai yang tidak diinisialisasi dilaporkan, Memcheck akan mencoba menampilkan
asal nilai. Asal dapat menjadi salah satu dari empat tempat berikut: blok tumpukan,
alokasi tumpukan, permintaan klien, atau sumber lain-lain (misalnya, panggilan ke
brk).
Untuk nilai yang tidak diinisialisasi yang berasal dari blok tumpukan, Memcheck menunjukkan di mana blok tersebut
dialokasikan. Untuk nilai yang tidak diinisialisasi yang berasal dari alokasi tumpukan, Memcheck
dapat memberi tahu Anda fungsi mana yang mengalokasikan nilai, tetapi tidak lebih dari itu -- biasanya itu
menunjukkan lokasi sumber kurung kurawal fungsi. Jadi kamu harus
hati-hati memeriksa bahwa semua variabel lokal fungsi diinisialisasi dengan benar.
Overhead kinerja: pelacakan asal mahal. Ini mengurangi separuh kecepatan Memcheck dan
meningkatkan penggunaan memori minimal 100MB, dan mungkin lebih. Namun demikian itu bisa
secara drastis mengurangi upaya yang diperlukan untuk mengidentifikasi akar penyebab dari uninitialized
kesalahan nilai, dan sering kali merupakan kemenangan produktivitas programmer, meskipun menjalankan lebih banyak
lambat.
Akurasi: Memcheck melacak asal dengan cukup akurat. Untuk menghindari ruang dan waktu yang sangat besar
overhead, beberapa perkiraan dibuat. Itu mungkin, meskipun tidak mungkin, bahwa
Memcheck akan melaporkan asal yang salah, atau tidak dapat mengidentifikasi asal apa pun.
Perhatikan bahwa kombinasi --track-origins=ya dan --undef-value-errors=tidak is
tidak masuk akal. Memcheck memeriksa dan menolak kombinasi ini saat startup.
--partial-loads-ok= [bawaan: Ya]
Mengontrol cara Memcheck menangani beban yang selaras secara alami 32-, 64-, 128- dan 256-bit dari
alamat yang beberapa byte dapat dialamatkan dan yang lainnya tidak. Kapan iya nihseperti itu
beban tidak menghasilkan kesalahan alamat. Sebaliknya, byte yang dimuat berasal dari ilegal
alamat ditandai sebagai belum diinisialisasi, dan yang sesuai dengan alamat resmi adalah
ditangani dengan cara biasa.
Ketika tidak, pemuatan dari alamat yang sebagian tidak valid diperlakukan sama dengan pemuatan dari
alamat yang benar-benar tidak valid: kesalahan alamat ilegal dikeluarkan, dan hasilnya
byte ditandai sebagai diinisialisasi.
Perhatikan bahwa kode yang berperilaku seperti ini melanggar standar ISO C/C++,
dan harus dianggap rusak. Jika memungkinkan, kode tersebut harus diperbaiki.
--expensive-definedness-checks= [bawaan: tidak]
Mengontrol apakah Memcheck harus menggunakan lebih tepat tetapi juga lebih mahal (waktu
mengkonsumsi) algoritma saat memeriksa definisi suatu nilai. Pengaturan default adalah
untuk tidak melakukan itu dan biasanya cukup. Namun, untuk kode yang sangat dioptimalkan
valgrind terkadang salah mengeluh. Memanggil valgrind dengan
--mahal-definisi-pemeriksaan=ya membantu tetapi datang dengan biaya kinerja. Waktu tayang
degradasi 25% telah diamati tetapi biaya tambahan sangat tergantung pada
aplikasi di tangan.
--keep-stacktrace=alloc|free|alloc-and-free|alloc-then-free|none [bawaan:
alokasi-dan-bebas]
Mengontrol jejak tumpukan mana yang akan disimpan untuk blok malloc'd dan/atau free'd.
Dengan alokasikan-lalu-bebas, jejak tumpukan dicatat pada waktu alokasi, dan dikaitkan
dengan blok. Ketika blok dibebaskan, jejak tumpukan kedua dicatat, dan ini
menggantikan jejak tumpukan alokasi. Akibatnya, kesalahan "penggunaan setelah bebas" apa pun terkait
ke blok ini hanya dapat menunjukkan jejak tumpukan di mana blok itu dibebaskan.
Dengan alokasi-dan-bebas, baik alokasi dan dealokasi tumpukan melacak untuk blok
disimpan. Oleh karena itu kesalahan "gunakan setelah gratis" akan menampilkan keduanya, yang dapat membuat kesalahan
lebih mudah untuk didiagnosis. Dibandingkan dengan alokasikan-lalu-bebas, pengaturan ini sedikit meningkat
Penggunaan memori Valgrind sebagai blok berisi dua referensi, bukan satu.
Dengan mengalokasikan, hanya jejak tumpukan alokasi yang dicatat (dan dilaporkan). Dengan gratis,
hanya jejak tumpukan deallokasi yang dicatat (dan dilaporkan). Nilai-nilai ini agak
mengurangi memori Valgrind dan penggunaan cpu. Mereka dapat berguna tergantung pada kesalahannya
jenis yang Anda cari dan tingkat detail yang Anda perlukan untuk menganalisisnya. Untuk
contoh, jika Anda hanya tertarik pada kesalahan kebocoran memori, cukup untuk merekam
jejak tumpukan alokasi.
Dengan tak satupun, tidak ada jejak tumpukan yang direkam untuk malloc dan operasi gratis. Jika Anda
program mengalokasikan banyak blok dan/atau mengalokasikan/membebaskan dari banyak tumpukan yang berbeda
jejak, ini dapat secara signifikan mengurangi cpu dan/atau memori yang dibutuhkan. Tentu saja, sedikit
detail akan dilaporkan untuk kesalahan yang terkait dengan blok tumpukan.
Perhatikan bahwa setelah jejak tumpukan direkam, Valgrind menyimpan jejak tumpukan di memori
bahkan jika itu tidak direferensikan oleh blok mana pun. Beberapa program (misalnya, rekursif
algoritma) dapat menghasilkan sejumlah besar jejak tumpukan. Jika Valgrind menggunakan terlalu banyak
memori dalam keadaan seperti itu, Anda dapat mengurangi memori yang diperlukan dengan opsi
--keep-stacktrace dan/atau dengan menggunakan nilai opsi yang lebih kecil --num-penelepon.
--freelist-vol= [bawaan: 20000000]
Ketika program klien melepaskan memori menggunakan gratis (dalam C) atau hapus (C++), memori itu
tidak segera tersedia untuk dialokasikan kembali. Sebaliknya, itu ditandai
tidak dapat diakses dan ditempatkan dalam antrian blok yang dibebaskan. Tujuannya adalah untuk menunda selama
mungkin titik di mana memori yang dibebaskan kembali beredar. Ini
meningkatkan kemungkinan Memcheck akan dapat mendeteksi akses yang tidak valid ke blok
untuk beberapa periode waktu yang signifikan setelah mereka dibebaskan.
Opsi ini menentukan ukuran total maksimum, dalam byte, dari blok dalam antrian.
Nilai default adalah dua puluh juta byte. Meningkatkan ini meningkatkan jumlah total
memori yang digunakan oleh Memcheck tetapi dapat mendeteksi penggunaan tidak valid dari blok yang dibebaskan yang akan
jika tidak, tidak terdeteksi.
--freelist-big-blocks= [bawaan: 1000000]
Saat membuat blok dari antrian blok yang dibebaskan tersedia untuk alokasi ulang,
Memcheck akan diprioritaskan kembali mengedarkan blok dengan ukuran lebih besar atau sama dengan
--daftar-gratis-blok-besar. Ini memastikan bahwa membebaskan blok besar (khususnya membebaskan
blok lebih besar dari --daftar bebas-vol) tidak segera menyebabkan sirkulasi ulang
semua (atau banyak) blok kecil dalam daftar gratis. Dengan kata lain, opsi ini
meningkatkan kemungkinan untuk menemukan penunjuk menjuntai untuk balok "kecil", bahkan
ketika blok besar dibebaskan.
Menetapkan nilai 0 berarti bahwa semua blok disirkulasikan kembali dalam urutan FIFO.
--workaround-gcc296-bugs= [bawaan: tidak]
Saat diaktifkan, asumsikan bahwa membaca dan menulis agak jauh di bawah penunjuk tumpukan
disebabkan oleh bug di GCC 2.96, dan tidak melaporkannya. "Jarak kecil" adalah 256
byte secara default. Perhatikan bahwa GCC 2.96 adalah kompiler default pada beberapa Linux kuno
distribusi (RedHat 7.X) sehingga Anda mungkin perlu menggunakan opsi ini. Jangan gunakan jika
Anda tidak harus melakukannya, karena dapat menyebabkan kesalahan nyata diabaikan. Alternatif yang lebih baik
adalah menggunakan GCC yang lebih baru untuk memperbaiki bug ini.
Anda mungkin juga perlu menggunakan opsi ini saat bekerja dengan GCC 3.X atau 4.X pada 32-bit
PowerPC Linux. Ini karena GCC menghasilkan kode yang kadang-kadang mengakses di bawah ini
penunjuk tumpukan, terutama untuk titik-mengambang ke/dari konversi bilangan bulat. Ini
melanggar spesifikasi PowerPC ELF 32-bit, yang tidak membuat ketentuan untuk
lokasi di bawah penunjuk tumpukan agar dapat diakses.
--show-mismatched-frees= [bawaan: Ya]
Saat diaktifkan, Memcheck memeriksa apakah blok tumpukan tidak dialokasikan menggunakan fungsi yang
cocok dengan fungsi alokasi. Artinya, ia mengharapkan gratis untuk digunakan untuk deallocate
blok yang dialokasikan oleh malloc, hapus untuk blok yang dialokasikan oleh yang baru, dan menghapus[] untuk
blok yang dialokasikan oleh baru[]. Jika ketidakcocokan terdeteksi, kesalahan dilaporkan. ini di
umum penting karena di beberapa lingkungan, membebaskan dengan fungsi yang tidak cocok
dapat menyebabkan crash.
Namun ada skenario di mana ketidaksesuaian tersebut tidak dapat dihindari. Saat itulah
pengguna menyediakan implementasi dari yang baru/baru[] panggilan itu malloc dan dari hapus/menghapus[]
panggilan itu gratis, dan fungsi-fungsi ini sejajar secara asimetris. Misalnya, bayangkan
bahwa menghapus[] sebaris tapi baru[] tidak. Hasilnya Memcheck "melihat" semua
menghapus[] panggilan sebagai panggilan langsung ke gratis, bahkan ketika sumber program tidak mengandung
panggilan yang tidak cocok.
Ini menyebabkan banyak laporan kesalahan yang membingungkan dan tidak relevan.
--show-mismatched-frees=tidak menonaktifkan pemeriksaan ini. Biasanya tidak disarankan untuk
nonaktifkan mereka, karena Anda mungkin kehilangan kesalahan nyata sebagai hasilnya.
--ignore-ranges=0xPP-0xQQ[,0xRR-0xSS]
Rentang apa pun yang tercantum dalam opsi ini (dan beberapa rentang dapat ditentukan, dipisahkan oleh
koma) akan diabaikan oleh pemeriksaan addressability Memcheck.
--malloc-isi=
Mengisi blok yang dialokasikan oleh malloc, new, dll, tetapi tidak oleh calloc, dengan yang ditentukan
byte. Ini dapat berguna ketika mencoba menghilangkan masalah kerusakan memori yang tidak jelas.
Area yang dialokasikan masih dianggap oleh Memcheck sebagai tidak ditentukan -- opsi ini saja
mempengaruhi isinya. Perhatikan bahwa --malloc-isi tidak mempengaruhi blok memori ketika
ini digunakan sebagai argumen untuk permintaan klien VALGRIND_MEMPOOL_ALLOC atau
VALGRIND_MALLOCLIKE_BLOCK.
--isi-bebas=
Mengisi blok yang dibebaskan oleh free, delete, dll, dengan nilai byte yang ditentukan. Ini bisa jadi
berguna ketika mencoba menghilangkan masalah kerusakan memori yang tidak jelas. Area yang dibebaskan adalah
masih dianggap oleh Memcheck sebagai tidak valid untuk akses -- opsi ini hanya memengaruhinya
isi. Perhatikan bahwa --isi-bebas tidak mempengaruhi blok memori saat digunakan sebagai
argumen untuk permintaan klien VALGRIND_MEMPOOL_FREE atau VALGRIND_FREELIKE_BLOCK.
CACHEGRIND PILIHAN
--I1= , , ukuran>
Tentukan ukuran, asosiasi, dan ukuran baris cache instruksi level 1.
--D1= , , ukuran>
Tentukan ukuran, asosiasi, dan ukuran baris cache data level 1.
--LL= , , ukuran>
Tentukan ukuran, asosiasi, dan ukuran baris cache tingkat terakhir.
--cache-sim=tidak|ya [Iya]
Mengaktifkan atau menonaktifkan pengumpulan akses cache dan jumlah yang terlewat.
--branch-sim=tidak|ya [tidak]
Mengaktifkan atau menonaktifkan kumpulan instruksi cabang dan penghitungan salah prediksi. Oleh
default ini dinonaktifkan karena memperlambat Cachegrind sekitar 25%. Perhatikan bahwa
Anda tidak dapat menentukan --cache-sim=tidak dan --branch-sim=tidak bersama-sama, karena itu akan pergi
Cachegrind tanpa informasi untuk dikumpulkan.
--cachegrind-out-file=
Tulis data profil ke file daripada ke file output default,
cachegrind.out. . NS %p dan %q penentu format dapat digunakan untuk menyematkan proses
ID dan/atau konten variabel lingkungan dalam nama, seperti halnya untuk
pilihan inti --file-log.
PANGGILAN PILIHAN
--callgrind-out-file=
Tulis data profil ke file daripada ke file output default,
panggilangrind.out. . NS %p dan %q penentu format dapat digunakan untuk menyematkan proses
ID dan/atau konten variabel lingkungan dalam nama, seperti halnya untuk
pilihan inti --file-log. Ketika beberapa dump dibuat, nama file diubah
lebih jauh; Lihat di bawah.
--dump-line= [bawaan: Ya]
Ini menetapkan bahwa penghitungan peristiwa harus dilakukan pada perincian baris sumber.
Ini memungkinkan anotasi sumber untuk sumber yang dikompilasi dengan informasi debug
(-g).
--dump-instr= [bawaan: tidak]
Ini menetapkan bahwa penghitungan peristiwa harus dilakukan pada perincian per-instruksi.
Ini memungkinkan untuk anotasi kode perakitan. Saat ini hasilnya hanya dapat ditampilkan
oleh KCachegrind.
--kompres-string= [bawaan: Ya]
Opsi ini mempengaruhi format output dari data profil. Ini menentukan apakah
string (nama file dan fungsi) harus diidentifikasi dengan angka. Ini mengecilkan
file, tetapi membuatnya lebih sulit bagi manusia untuk membaca (yang tidak direkomendasikan dalam
kasus).
--kompres-pos= [bawaan: Ya]
Opsi ini mempengaruhi format output dari data profil. Ini menentukan apakah
posisi numerik selalu ditentukan sebagai nilai absolut atau diizinkan untuk menjadi
dibandingkan dengan angka sebelumnya. Ini mengecilkan ukuran file.
--combine-dumps= [bawaan: tidak]
Saat diaktifkan, saat beberapa bagian data profil akan dibuat, bagian ini adalah
ditambahkan ke file output yang sama. Tidak direkomendasikan.
--dump-every-bb= [bawaan: 0, tidak pernah]
Buang data profil setiap menghitung blok dasar. Apakah dump diperlukan hanya diperiksa
ketika penjadwal internal Valgrind dijalankan. Oleh karena itu, pengaturan minimum yang berguna adalah
sekitar 100000. Hitungannya adalah nilai 64-bit untuk memungkinkan periode dump yang lama.
--dump-sebelum=
Buang saat masuk fungsi.
--nol-sebelum=
Nol semua biaya saat masuk fungsi.
--dump-setelah=
Buang saat pergi fungsi.
--instr-atstart= [bawaan: Ya]
Tentukan apakah Anda ingin Callgrind memulai simulasi dan pembuatan profil dari awal
program. Jika disetel ke tidak, Callgrind tidak akan dapat mengumpulkan informasi apa pun,
termasuk panggilan, tetapi akan memiliki perlambatan paling banyak sekitar 4, yang merupakan minimum
Valgrind di atas kepala. Instrumentasi dapat diaktifkan secara interaktif melalui callgrind_control
-aku aktif.
Perhatikan bahwa grafik panggilan yang dihasilkan kemungkinan besar tidak berisi utama, tapi akan
berisi semua fungsi yang dijalankan setelah instrumentasi diaktifkan. Peralatan
juga dapat diaktifkan/dinonaktifkan secara terprogram. Lihat Callgrind termasuk file callgrind.h
untuk makro yang harus Anda gunakan dalam kode sumber Anda.
Untuk simulasi cache, hasil akan kurang akurat saat menyalakan instrumentasi
kemudian dalam program dijalankan, saat simulator dimulai dengan cache kosong pada saat itu.
Aktifkan pengumpulan acara nanti untuk mengatasi kesalahan ini.
--collect-atstart= [bawaan: Ya]
Tentukan apakah pengumpulan peristiwa diaktifkan di awal menjalankan profil.
Untuk hanya melihat bagian dari program Anda, Anda memiliki dua kemungkinan:
1. Nol penghitung acara sebelum memasuki bagian program yang ingin Anda profil, dan buang
acara counter ke file setelah meninggalkan bagian program itu.
2. Aktifkan/nonaktifkan status pengumpulan sesuai kebutuhan untuk hanya melihat penghitung acara yang terjadi
saat berada di dalam bagian program yang ingin Anda profil.
Opsi kedua dapat digunakan jika bagian program yang ingin Anda profil disebut banyak
waktu. Opsi 1, yaitu membuat banyak dump tidak praktis di sini.
Status koleksi dapat diaktifkan saat masuk dan keluar dari fungsi yang diberikan dengan opsi
--toggle-collect. Jika Anda menggunakan opsi ini, status pengumpulan harus dinonaktifkan di
awal. Perhatikan bahwa spesifikasi --toggle-collect set implisit
--collect-state=tidak.
Status koleksi dapat diubah juga dengan memasukkan permintaan klien
CALLGRIND_TOGGLE_COLLECT ; pada posisi kode yang dibutuhkan.
--toggle-collect=
Alihkan koleksi saat masuk/keluar dari fungsi.
--collect-jumps= [bawaan: tidak]
Ini menentukan apakah informasi untuk lompatan (bersyarat) harus dikumpulkan. Sebagai
di atas, callgrind_annotate saat ini tidak dapat menampilkan data kepada Anda. Anda harus menggunakan
KCachegrind untuk mendapatkan panah lompat dalam kode beranotasi.
--kumpulkan-sistem= [bawaan: tidak]
Ini menentukan apakah informasi untuk waktu panggilan sistem harus dikumpulkan.
--collect-bus= [bawaan: tidak]
Ini menentukan apakah jumlah kejadian bus global yang dieksekusi harus dikumpulkan.
Jenis acara "Ge" digunakan untuk acara ini.
--cache-sim= [bawaan: tidak]
Tentukan jika Anda ingin melakukan simulasi cache penuh. Secara default, hanya instruksi yang dibaca
akses akan dihitung ("Ir"). Dengan simulasi cache, penghitung acara lebih lanjut adalah
diaktifkan: Cache tidak terjawab pada pembacaan instruksi ("I1mr"/"ILmr"), akses baca data ("Dr")
dan cache yang hilang ("D1mr"/"DLmr"), akses penulisan data ("Dw") dan cache terkait
meleset ("D1mw"/"DLmw"). Untuk informasi lebih lanjut, lihat Cachegrind: cache dan branch-
profiler prediksi.
--branch-sim= [bawaan: tidak]
Tentukan jika Anda ingin melakukan simulasi prediksi cabang. Penghitung acara lebih lanjut adalah
diaktifkan: Jumlah cabang bersyarat yang dieksekusi dan kesalahan prediksi terkait
("Bc"/"Bcm"), lompatan tidak langsung yang dieksekusi dan kesalahan terkait dari prediktor alamat lompatan
("Bi"/"Bim").
BANTUAN PILIHAN
--free-is-write=tidak|ya [bawaan: tidak]
Saat diaktifkan (bukan default), Helgrind memperlakukan pembebasan memori heap seolah-olah
memori ditulis segera sebelum gratis. Ini mengekspos ras di mana memori berada
direferensikan oleh satu utas, dan dibebaskan oleh yang lain, tetapi tidak ada yang dapat diamati
acara sinkronisasi untuk memastikan bahwa referensi terjadi sebelum gratis.
Fungsionalitas ini baru di Valgrind 3.7.0, dan dianggap sebagai eksperimental. Dia
tidak diaktifkan secara default karena interaksinya dengan pengalokasi memori khusus tidak
dipahami dengan baik saat ini. Umpan balik pengguna disambut.
--track-lockorders=tidak|ya [bawaan: Ya]
Saat diaktifkan (default), Helgrind melakukan pemeriksaan konsistensi urutan kunci. Untuk
beberapa program kereta, sejumlah besar kesalahan urutan kunci yang dilaporkan dapat menjadi
menjengkelkan, terutama jika Anda hanya tertarik pada kesalahan balapan. Oleh karena itu, Anda mungkin
merasa terbantu untuk menonaktifkan pemeriksaan urutan kunci.
--history-level=none|perkiraan|penuh [bawaan: penuh]
--tingkat-sejarah=penuh (default) menyebabkan Helgrind mengumpulkan informasi yang cukup tentang
akses "lama" yang dapat menghasilkan dua jejak tumpukan dalam laporan balapan -- keduanya tumpukan
jejak untuk akses saat ini, dan jejak untuk akses yang lebih lama dan bertentangan. Ke
batasi penggunaan memori, akses "lama" jejak tumpukan dibatasi maksimal 8 entri,
meskipun --num-penelepon nilainya lebih besar.
Mengumpulkan informasi seperti itu mahal dalam kecepatan dan memori, terutama untuk
program yang melakukan banyak acara sinkronisasi antar-utas (mengunci, membuka kunci, dll).
Tanpa informasi tersebut, lebih sulit untuk melacak akar penyebab ras.
Meskipun demikian, Anda mungkin tidak memerlukannya dalam situasi di mana Anda hanya ingin memeriksa
ada atau tidak adanya ras, misalnya, saat melakukan pengujian regresi a
program bebas balapan sebelumnya.
--tingkat-sejarah=tidak ada adalah kebalikan ekstrim. Itu menyebabkan Helgrind tidak mengumpulkan apapun
informasi tentang akses sebelumnya. Ini bisa jauh lebih cepat daripada
--tingkat-sejarah=penuh.
--tingkat-sejarah=perkiraan memberikan kompromi antara dua ekstrem ini. Itu menyebabkan
Helgrind untuk menunjukkan jejak lengkap untuk akses selanjutnya, dan informasi perkiraan
mengenai akses sebelumnya. Informasi perkiraan ini terdiri dari dua tumpukan, dan
akses sebelumnya dijamin telah terjadi di suatu tempat di antara titik-titik program
dilambangkan dengan dua tumpukan. Ini tidak berguna seperti menunjukkan tumpukan yang tepat untuk
akses sebelumnya (sebagai --tingkat-sejarah=penuh tidak), tetapi itu lebih baik daripada tidak sama sekali, dan itu
hampir secepat --tingkat-sejarah=tidak ada.
--ukuran-cache-konflik=N [bawaan: 1000000]
Bendera ini hanya memiliki efek pada --tingkat-sejarah=penuh.
Informasi tentang akses konflik "lama" disimpan dalam cache dengan ukuran terbatas,
dengan manajemen gaya LRU. Hal ini diperlukan karena tidak praktis untuk menyimpan
stack trace untuk setiap akses memori yang dibuat oleh program. Informasi sejarah
di lokasi yang tidak baru diakses secara berkala dibuang, untuk mengosongkan ruang di
cache.
Opsi ini mengontrol ukuran cache, dalam hal jumlah memori yang berbeda
alamat yang menyimpan informasi akses yang bertentangan. Jika Anda menemukan itu
Helgrind menunjukkan kesalahan balapan dengan hanya satu tumpukan, bukan dua yang diharapkan
tumpukan, coba tingkatkan nilai ini.
Nilai minimum adalah 10,000 dan maksimum adalah 30,000,000 (tiga puluh kali default
nilai). Meningkatkan nilai sebesar 1 meningkatkan kebutuhan memori Helgrind sebesar
kira-kira 100 byte, jadi nilai maksimum akan dengan mudah menghabiskan tiga gigabyte ekstra atau lebih
memori.
--check-stack-refs=tidak|ya [bawaan: Ya]
Secara default Helgrind memeriksa semua akses memori data yang dibuat oleh program Anda. Bendera ini
memungkinkan Anda untuk melewati pemeriksaan akses ke tumpukan utas (variabel lokal). Ini bisa
meningkatkan kinerja, tetapi harus mengorbankan balapan yang hilang pada data yang dialokasikan tumpukan.
--ignore-thread-creation= [bawaan: tidak]
Mengontrol apakah semua aktivitas selama pembuatan utas harus diabaikan. Secara default
diaktifkan hanya di Solaris. Solaris memberikan throughput yang lebih tinggi, paralelisme dan
skalabilitas daripada sistem operasi lain, dengan biaya penguncian yang lebih halus
aktivitas. Ini berarti misalnya ketika sebuah utas dibuat di bawah glibc, hanya satu
kunci besar digunakan untuk semua pengaturan utas. Solaris libc menggunakan beberapa kunci berbutir halus
dan utas pembuat melanjutkan aktivitasnya sesegera mungkin, pergi misalnya
tumpukan dan urutan pengaturan TLS ke utas yang dibuat. Situasi ini membingungkan Helgrind
karena mengasumsikan ada beberapa urutan yang salah antara pencipta dan yang diciptakan
benang; dan oleh karena itu banyak jenis kondisi balapan dalam aplikasi tidak akan
dilaporkan. Untuk mencegah pemesanan yang salah seperti itu, opsi baris perintah ini disetel ke ya oleh
default di Solaris. Oleh karena itu, semua aktivitas (memuat, menyimpan, permintaan klien) diabaikan
selama:
· pthread_create() panggilan di utas pembuat
· fase pembuatan utas (penyiapan tumpukan dan TLS) di utas yang dibuat
Juga memori baru yang dialokasikan selama pembuatan utas tidak terlacak, yaitu pelaporan balapan
ditekan di sana. DRD melakukan hal yang sama secara implisit. Ini perlu karena
Solaris libc menyimpan banyak objek dan menggunakannya kembali untuk utas yang berbeda dan itu
membingungkan Helgrind.
DRD PILIHAN
--check-stack-var= [bawaan: tidak]
Mengontrol apakah DRD mendeteksi data race pada variabel stack. Memverifikasi variabel tumpukan
dinonaktifkan secara default karena sebagian besar program tidak membagikan variabel tumpukan secara berlebihan
utas.
--eksklusif-ambang= [bawaan: mati]
Cetak pesan kesalahan jika ada mutex atau kunci penulis yang ditahan lebih lama dari waktu tersebut
ditentukan dalam milidetik. Opsi ini memungkinkan deteksi pertikaian kunci.
--join-list-vol= [bawaan: 10]
Perlombaan data yang terjadi antara pernyataan di akhir satu utas dan utas lainnya
dapat terlewatkan jika informasi akses memori dibuang segera setelah utas memiliki
telah bergabung. Opsi ini memungkinkan seseorang untuk menentukan berapa banyak memori utas yang digabungkan
akses informasi harus dipertahankan.
--hanya balapan pertama= [bawaan: tidak]
Apakah akan melaporkan hanya balapan data pertama yang telah terdeteksi di lokasi memori
atau semua ras data yang telah terdeteksi pada lokasi memori.
--free-is-write= [bawaan: tidak]
Apakah akan melaporkan balapan antara mengakses memori dan membebaskan memori. Mengaktifkan ini
opsi dapat menyebabkan DRD berjalan sedikit lebih lambat. Catatan:
· Jangan aktifkan opsi ini saat menggunakan pengalokasi memori khusus yang menggunakan
VG_USERREQ__MALLOCLIKE_BLOCK dan VG_USERREQ__FREELIKE_BLOCK karena itu akan
mengakibatkan positif palsu.
· Jangan aktifkan opsi ini saat menggunakan objek terhitung referensi karena itu akan
menghasilkan positif palsu, bahkan ketika kode itu telah dijelaskan dengan benar dengan
ANNOTATE_HAPPENS_BEFORE dan ANNOTATE_HAPPENS_AFTER. Lihat misalnya output dari
perintah berikut untuk contoh: valgrind --tool=drd --free-is-write=yes
drd/tes/annotate_smart_pointer.
--report-signal-unlocked= [bawaan: Ya]
Apakah akan melaporkan panggilan ke pthread_cond_signal dan pthread_cond_broadcast dimana
mutex terkait dengan sinyal melalui pthread_cond_tunggu or
pthread_cond_timed_waittidak terkunci pada saat sinyal dikirim. Mengirim sinyal
tanpa menahan kunci pada mutex terkait adalah kesalahan pemrograman umum yang dapat
menyebabkan kondisi balapan yang halus dan perilaku yang tidak dapat diprediksi. Ada beberapa yang tidak biasa
pola sinkronisasi namun aman untuk mengirim sinyal tanpa menahan a
mengunci mutex terkait.
--penggabungan-segmen= [bawaan: Ya]
Mengontrol penggabungan segmen. Penggabungan segmen adalah algoritma untuk membatasi penggunaan memori dari
algoritma pendeteksian data race. Menonaktifkan penggabungan segmen dapat meningkatkan akurasi
apa yang disebut 'segmen lain' ditampilkan dalam laporan balapan tetapi juga dapat memicu keluar
dari kesalahan memori.
--segment-merging-interval= [bawaan: 10]
Lakukan penggabungan segmen hanya setelah jumlah segmen baru yang ditentukan telah
dibuat. Ini adalah opsi konfigurasi lanjutan yang memungkinkan seseorang untuk memilih apakah akan
meminimalkan penggunaan memori DRD dengan memilih nilai rendah atau membiarkan DRD berjalan lebih cepat dengan
memilih nilai yang sedikit lebih tinggi. Nilai optimal untuk parameter ini tergantung pada
program yang sedang dianalisis. Nilai default berfungsi dengan baik untuk sebagian besar program.
--batas-bersama= [bawaan: mati]
Cetak pesan kesalahan jika kunci pembaca ditahan lebih lama dari waktu yang ditentukan
(dalam milidetik). Opsi ini memungkinkan deteksi pertikaian kunci.
--show-confl-seg= [bawaan: Ya]
Tampilkan segmen yang bentrok dalam laporan balapan. Karena informasi ini dapat membantu untuk menemukan
penyebab ras data, opsi ini diaktifkan secara default. Menonaktifkan opsi ini membuat
output DRD lebih kompak.
--show-stack-usage= [bawaan: tidak]
Cetak penggunaan tumpukan pada waktu keluar utas. Ketika sebuah program membuat sejumlah besar
utas menjadi penting untuk membatasi jumlah memori virtual yang dialokasikan untuk
tumpukan benang. Opsi ini memungkinkan untuk mengamati berapa banyak memori tumpukan
digunakan oleh setiap utas program klien. Catatan: alat DRD itu sendiri mengalokasikan beberapa
data sementara di tumpukan utas klien. Ruang yang diperlukan untuk data sementara ini
harus dialokasikan oleh program klien ketika mengalokasikan memori stack, tetapi tidak
termasuk dalam penggunaan tumpukan yang dilaporkan oleh DRD.
--ignore-thread-creation= [bawaan: tidak]
Mengontrol apakah semua aktivitas selama pembuatan utas harus diabaikan. Secara default
diaktifkan hanya di Solaris. Solaris memberikan throughput yang lebih tinggi, paralelisme dan
skalabilitas daripada sistem operasi lain, dengan biaya penguncian yang lebih halus
aktivitas. Ini berarti misalnya ketika sebuah utas dibuat di bawah glibc, hanya satu
kunci besar digunakan untuk semua pengaturan utas. Solaris libc menggunakan beberapa kunci berbutir halus
dan utas pembuat melanjutkan aktivitasnya sesegera mungkin, pergi misalnya
tumpukan dan urutan pengaturan TLS ke utas yang dibuat. Situasi ini membingungkan DRD karena
mengasumsikan ada beberapa urutan yang salah antara pembuat dan utas yang dibuat; dan
oleh karena itu banyak jenis kondisi balapan dalam aplikasi tidak akan dilaporkan. Ke
mencegah pemesanan yang salah seperti itu, opsi baris perintah ini disetel ke ya secara default pada
Solaris. Oleh karena itu, semua aktivitas (memuat, menyimpan, permintaan klien) diabaikan selama:
· pthread_create() panggilan di utas pembuat
· fase pembuatan utas (penyiapan tumpukan dan TLS) di utas yang dibuat
--trace-addr= [bawaan: tidak ada]
Lacak semua aktivitas pemuatan dan penyimpanan untuk alamat yang ditentukan. Opsi ini mungkin
ditentukan lebih dari satu kali.
--ptrace-addr= [bawaan: tidak ada]
Lacak semua aktivitas muat dan simpan untuk alamat yang ditentukan dan terus lakukan itu bahkan
setelah memori di alamat itu telah dibebaskan dan dialokasikan kembali.
--trace-alloc= [bawaan: tidak]
Lacak semua alokasi dan dealokasi memori. Dapat menghasilkan output dalam jumlah besar.
--trace-barrier= [bawaan: tidak]
Lacak semua aktivitas penghalang.
--trace-cond= [bawaan: tidak]
Lacak semua aktivitas variabel kondisi.
--trace-fork-join= [bawaan: tidak]
Lacak semua pembuatan utas dan semua peristiwa penghentian utas.
--trace-hb= [bawaan: tidak]
Lacak eksekusi ANNOTATE_HAPPENS_BEFORE(), ANNOTATE_HAPPENS_AFTER() dan
ANNOTATE_HAPPENS_DONE() permintaan klien.
--trace-mutex= [bawaan: tidak]
Lacak semua aktivitas mutex.
--trace-rwlock= [bawaan: tidak]
Lacak semua aktivitas kunci pembaca-penulis.
--trace-semaphore= [bawaan: tidak]
Lacak semua aktivitas semaphore.
BESAR PILIHAN
--tumpukan= [bawaan: Ya]
Menentukan apakah profil heap harus dilakukan.
--heap-admin= [bawaan: 8]
Jika profil heap diaktifkan, berikan jumlah byte administratif per blok ke
menggunakan. Ini harus merupakan perkiraan rata-rata, karena dapat bervariasi. Misalnya,
pengalokasi yang digunakan oleh glibc di Linux membutuhkan antara 4 hingga 15 byte per blok,
tergantung pada berbagai faktor. Pengalokasi itu juga membutuhkan ruang admin untuk dibebaskan
blok, tetapi Massif tidak dapat menjelaskan hal ini.
--tumpukan= [bawaan: tidak]
Menentukan apakah profil tumpukan harus dilakukan. Opsi ini memperlambat Massif
sangat, dan mati secara default. Perhatikan bahwa Massif mengasumsikan bahwa tumpukan utama memiliki
ukuran nol saat start-up. Ini tidak benar, tetapi melakukan sebaliknya secara akurat itu sulit.
Selanjutnya, mulai dari nol lebih baik menunjukkan ukuran bagian dari tumpukan utama
bahwa program pengguna benar-benar memiliki kendali atas.
--pages-as-heap= [bawaan: tidak]
Memberitahu Massif untuk memprofilkan memori di tingkat halaman daripada di blok malloc
tingkat. Lihat di atas untuk detailnya.
--kedalaman= [bawaan: 30]
Kedalaman maksimum pohon alokasi yang direkam untuk snapshot mendetail. Meningkatkannya
akan membuat Massif berjalan agak lebih lambat, menggunakan lebih banyak memori, dan menghasilkan output yang lebih besar
file.
--alloc-fn=
Fungsi yang ditentukan dengan opsi ini akan diperlakukan seolah-olah mereka adalah tumpukan
fungsi alokasi seperti malloc. Ini berguna untuk fungsi yang merupakan pembungkus untuk
malloc or yang baru, yang dapat mengisi pohon alokasi dengan informasi yang tidak menarik.
Opsi ini dapat ditentukan beberapa kali pada baris perintah, untuk menyebutkan beberapa
fungsi.
Perhatikan bahwa fungsi bernama hanya akan diperlakukan seperti ini jika itu adalah entri teratas dalam a
stack trace, atau tepat di bawah fungsi lain yang diperlakukan dengan cara ini. Misalnya, jika Anda memiliki
sebuah fungsi malloc1 yang membungkus malloc, dan malloc2 yang membungkus malloc1, hanya menentukan
--alloc-fn=malloc2 tidak akan berpengaruh. Anda perlu menentukan --alloc-fn=malloc1 as
dengan baik. Ini sedikit merepotkan, tetapi alasannya adalah untuk memeriksa alokasi
fungsi lambat, dan menghemat banyak waktu jika Massif dapat berhenti melihat melalui
tumpukan entri jejak segera setelah menemukan yang tidak cocok daripada harus
lanjutkan melalui semua entri.
Perhatikan bahwa nama C++ diurai. Perhatikan juga bahwa nama C++ yang kelebihan beban harus ditulis
sepenuhnya. Kutipan tunggal mungkin diperlukan untuk mencegah shell memecahnya.
Sebagai contoh:
--alloc-fn='operator baru(tidak ditandatangani, std::nothrow_t const&)'
--abaikan-fn=
Setiap alokasi tumpukan langsung (yaitu panggilan ke malloc, yang baru, dll, atau panggilan ke suatu fungsi
bernama oleh an --alokasikan-fn opsi) yang terjadi dalam fungsi yang ditentukan oleh opsi ini akan
diabaikan. Ini sebagian besar berguna untuk tujuan pengujian. Opsi ini dapat ditentukan
beberapa kali pada baris perintah, untuk menyebutkan beberapa fungsi.
Apa saja mengalokasikan kembali dari blok yang diabaikan juga akan diabaikan, bahkan jika mengalokasikan kembali panggilan tidak
tidak terjadi pada fungsi yang diabaikan. Ini menghindari kemungkinan ukuran tumpukan negatif
jika blok yang diabaikan diciutkan dengan mengalokasikan kembali.
Aturan penulisan nama fungsi C++ sama dengan for --alokasikan-fn atas.
--ambang = [bawaan: 1.0]
Ambang signifikansi untuk alokasi heap, sebagai persentase dari total ukuran memori.
Entri pohon alokasi yang memperhitungkan kurang dari ini akan digabungkan. Perhatikan bahwa
ini harus ditentukan bersama-sama dengan opsi ms_print dengan nama yang sama.
--puncak-ketidakakuratan= [bawaan: 1.0]
Massif tidak selalu mencatat puncak alokasi memori global yang sebenarnya; oleh
default itu merekam puncak hanya ketika ukuran alokasi memori global melebihi
puncak sebelumnya setidaknya 1.0%. Ini karena ada banyak alokasi lokal
memuncak di sepanjang jalan, dan melakukan snapshot mendetail untuk setiap foto akan mahal
dan boros, karena semua kecuali satu dari mereka nantinya akan dibuang. Ketidakakuratan ini bisa jadi
diubah (bahkan menjadi 0.0%) melalui opsi ini, tetapi Massif akan berjalan secara drastis lebih lambat sebagai
bilangan mendekati nol.
--waktu-satuan= [bawaan: i]
Satuan waktu yang digunakan untuk pembuatan profil. Ada tiga kemungkinan: instruksi
dieksekusi (i), yang bagus untuk sebagian besar kasus; waktu nyata (jam dinding) (ms, yaitu
milidetik), yang terkadang berguna; dan byte yang dialokasikan/dialokasikan di heap
dan/atau tumpukan (B), yang berguna untuk program jangka pendek, dan untuk pengujian
tujuan, karena ini adalah yang paling dapat direproduksi di mesin yang berbeda.
--detail-frekuensi= [bawaan: 10]
Frekuensi snapshot rinci. Dengan --detail-frekuensi=1, setiap snapshot dirinci.
--max-snapshot= [bawaan: 100]
Jumlah maksimum foto yang direkam. Jika diatur ke N, untuk semua program kecuali very
yang berjalan singkat, jumlah snapshot terakhir akan berada di antara N/2 dan N.
--massif-out-file= [bawaan: massif.keluar.%p]
Tulis data profil ke file daripada ke file output default,
massif.out. . NS %p dan %q penentu format dapat digunakan untuk menyematkan ID proses
dan/atau konten variabel lingkungan dalam nama, seperti halnya untuk
pilihan inti --file-log.
SGCHECK PILIHAN
Tidak ada opsi baris perintah khusus SGCheck saat ini.
BBV PILIHAN
--bb-out-file= [bawaan: bb.keluar.%p]
Opsi ini memilih nama file vektor blok dasar. NS %p dan %q format
penentu dapat digunakan untuk menyematkan ID proses dan/atau konten lingkungan
variabel dalam nama, seperti halnya untuk opsi inti --file-log.
--pc-out-file= [bawaan: pc.keluar.%p]
Opsi ini memilih nama file PC. File ini menyimpan alamat penghitung program
dan info nama fungsi untuk berbagai blok dasar. Ini dapat digunakan bersama
dengan file vektor blok dasar untuk maju cepat melalui nama fungsi, bukan hanya
jumlah instruksi. NS %p dan %q penentu format dapat digunakan untuk menyematkan proses
ID dan/atau konten variabel lingkungan dalam nama, seperti halnya untuk
pilihan inti --file-log.
--ukuran-interval= [bawaan: 100000000]
Opsi ini memilih ukuran interval yang akan digunakan. Defaultnya adalah 100 juta
instruksi, yang merupakan nilai yang umum digunakan. Ukuran lain dapat digunakan; lebih kecil
interval dapat membantu program dengan fase yang lebih halus. Namun ukuran interval yang lebih kecil
dapat menyebabkan masalah akurasi karena efek pemanasan (Saat meneruskan berbagai
fitur arsitektur tidak akan diinisialisasi, dan akan membutuhkan beberapa
instruksi sebelum mereka "pemanasan" ke keadaan simulasi penuh tanpa
penerusan cepat. Ukuran interval yang besar cenderung mengurangi hal ini.)
--instr-hitung-saja [bawaan: tidak]
Opsi ini memberi tahu alat untuk hanya menampilkan total jumlah instruksi, dan tidak
menghasilkan file vektor blok dasar yang sebenarnya. Ini berguna untuk debugging, dan untuk
mengumpulkan info jumlah instruksi tanpa menghasilkan vektor blok dasar yang besar
file.
PESURUH PILIHAN
--hitungan-dasar= [bawaan: Ya]
Saat diaktifkan, Lackey mencetak statistik dan informasi berikut tentang
eksekusi program klien:
1. Jumlah panggilan ke fungsi yang ditentukan oleh --namanama opsi (default
adalah utama). Jika program telah dilucuti simbolnya, hitungannya akan selalu menjadi
nol.
2. Jumlah cabang bersyarat yang ditemui dan jumlah serta proporsi
yang diambil.
3. Jumlah superblok yang dimasukkan dan diselesaikan oleh program. Perhatikan bahwa karena
optimisasi yang dilakukan oleh JIT, ini sama sekali bukan nilai yang akurat.
4. Jumlah instruksi tamu (x86, amd64, ppc, dll.) dan pernyataan IR
dieksekusi. IR adalah representasi perantara mirip RISC Valgrind yang melaluinya semua
instrumentasi dilakukan.
5. Rasio antara beberapa hitungan ini.
6. Kode keluar dari program klien.
--detail-hitungan= [bawaan: tidak]
Saat diaktifkan, Lackey mencetak tabel yang berisi jumlah muatan, penyimpanan, dan ALU
operasi, dibedakan oleh jenis IR mereka. Jenis IR diidentifikasi oleh IR mereka
nama ("I1", "I8", ... "I128", "F32", "F64", dan "V128").
--trace-mem= [bawaan: tidak]
Saat diaktifkan, Lackey mencetak ukuran dan alamat hampir setiap akses memori yang dibuat oleh
program. Lihat komentar di bagian atas file antek/lk_main.c untuk detailnya
tentang format output, cara kerjanya, dan ketidakakuratan dalam pelacakan alamat. Catatan
bahwa opsi ini menghasilkan sejumlah besar output.
--trace-superblocks= [bawaan: tidak]
Saat diaktifkan, Lackey mencetak alamat setiap superblok (satu entri,
multiple exit, potongan kode linier) dieksekusi oleh program. Ini terutama dari
menarik bagi pengembang Valgrind. Lihat komentar di bagian atas file
lessey/lk_main.c untuk detail tentang format output. Perhatikan bahwa opsi ini menghasilkan
keluaran dalam jumlah besar.
--fnname= [bawaan: utama]
Mengubah fungsi yang panggilannya akan dihitung saat --basic-counts=ya ditentukan.
Gunakan valgrind.bin online menggunakan layanan onworks.net