Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Perintah .call menyebabkan proses target menjalankan fungsi.
.call [/v] Function( Arguments )
.call /s Prototype Function( Arguments )
.call /c
.call /C
Parameter
/v
Informasi verbose tentang panggilan dan argumennya ditampilkan.
/s Prototipe
Memungkinkan Anda memanggil fungsi yang ditentukan oleh Fungsi meskipun Anda tidak memiliki simbol yang benar. Dalam hal ini, Anda harus memiliki simbol untuk fungsi lain yang memiliki prototipe panggilan yang sama dengan fungsi yang coba Anda panggil. Parameter Prototipe adalah nama fungsi prototipe ini.
Fungsi
Menentukan fungsi yang sedang dipanggil. Ini bisa menjadi nama fungsi (sebaiknya memenuhi syarat dengan nama modul), atau ekspresi lain yang mengevaluasi ke alamat fungsi. Jika Anda perlu memanggil konstruktor atau destruktor, Anda harus menyediakan alamat -- atau menggunakan ekspresi C++ untuk mengevaluasi sintaks bernama untuk operator (lihat Sintaks Ekspresi Numerik untuk detailnya).
Argumen
Menentukan argumen yang diteruskan ke fungsi. Jika Anda memanggil metode, argumen pertama harus ini, dan semua argumen lainnya mengikutinya. Argumen harus dipisahkan dengan koma dan harus cocok dengan sintaks argumen yang biasa. Daftar argumen panjang variabel didukung. Ekspresi dalam argumen diurai oleh evaluator ekspresi C++; lihat Nomor dan Operator C++ untuk detailnya. Anda tidak dapat memasukkan string harfiah sebagai argumen, tetapi Anda dapat menggunakan penunjuk ke string, atau memori lain yang dapat diakses oleh proses target.
/c
Menghapus panggilan yang ada pada utas saat ini.
/C
Menghapus panggilan yang ada pada utas saat ini, dan mengatur ulang konteks utas saat ini ke konteks yang disimpan oleh panggilan terutang.
Lingkungan
Mode |
mode pengguna saja |
Target |
penelusuran kesalahan langsung saja |
Platform |
x86 dan x64 saja |
Keterangan
Fungsi yang ditentukan dipanggil oleh utas saat ini dari proses saat ini.
Hanya konvensi panggilan cdecl, stdcall, fastcall, dan thiscall yang didukung. Kode terkelola tidak dapat dipanggil oleh perintah ini.
Setelah .call digunakan, debugger akan memperbarui tumpukan, mengubah pointer instruksi untuk menunjuk ke awal fungsi yang dipanggil, lalu berhenti. Gunakan g (Go) untuk melanjutkan eksekusi, atau ~. g untuk menjalankan hanya utas yang melakukan panggilan.
Saat fungsi kembali, pemutusan terjadi dan debugger menampilkan nilai pengembalian fungsi. Nilai pengembalian juga disimpan dalam $callret pseudo-register, yang memperoleh jenis nilai yang dikembalikan.
Jika Anda telah masuk ke target menggunakan CTRL+C atau CTRL+BREAK, utas saat ini adalah utas tambahan yang dibuat untuk menangani breakin. Jika Anda mengeluarkan perintah .call pada saat ini, utas tambahan akan digunakan untuk fungsi yang disebut.
Jika Anda telah mencapai titik henti yang telah ditentukan sebelumnya, tidak ada utas breakin tambahan. Jika Anda menggunakan .call saat berada di titik henti dalam mode pengguna, Anda dapat menggunakan g untuk menjalankan seluruh proses, atau ~. g untuk menjalankan utas saat ini saja. Menggunakan g dapat mendistorsi perilaku program Anda, karena Anda telah mengambil satu utas dan mengalihkannya ke fungsi baru ini. Di sisi lain, utas ini masih akan memiliki kunci dan atribut lain, dan dengan demikian ~. g mungkin berisiko kebuntuan.
Cara paling aman untuk menggunakan .call adalah dengan mengatur titik henti dalam kode Anda di lokasi di mana fungsi tertentu dapat dipanggil dengan aman. Ketika titik henti tersebut tertembak, Anda dapat menggunakan .call jika Anda ingin fungsi tersebut dijalankan. Jika Anda menggunakan .call pada titik di mana fungsi ini biasanya tidak dapat dipanggil, kebuntuan atau kerusakan target dapat mengakibatkan.
Mungkin berguna untuk menambahkan fungsi tambahan ke kode sumber Anda yang tidak dipanggil oleh kode yang ada, tetapi dimaksudkan untuk dipanggil oleh debugger. Misalnya, Anda dapat menambahkan fungsi yang digunakan untuk menyelidiki status kode Anda saat ini dan lingkungannya dan menyimpan informasi tentang status di lokasi memori yang diketahui. Pastikan untuk tidak mengoptimalkan kode Anda, atau fungsi-fungsi ini dapat dihapus oleh pengkompilasi. Gunakan teknik ini hanya sebagai upaya terakhir, karena jika aplikasi Anda mengalami crash .call tidak akan tersedia saat men-debug file cadangan.
Perintah .call /c dan .call /C hanya boleh digunakan jika upaya untuk menggunakan .call gagal, atau jika Anda berubah pikiran sebelum memasukkan perintah g. Ini tidak boleh digunakan dengan santai, karena meninggalkan panggilan yang belum selesai dapat menyebabkan status target yang rusak.
Contoh kode berikut menunjukkan bagaimana perintah .call /s digunakan.
.call /s KnownFunction UnknownFunction( 1 )
Dalam contoh ini, Anda memiliki simbol privat untuk KnownFunction, yang mengambil bilangan bulat sebagai satu-satunya argumen dan pengembaliannya, misalnya, pointer ke array. Anda tidak memiliki simbol, atau mungkin Anda hanya memiliki simbol publik untuk UnknownFunction, tetapi Anda tahu bahwa dibutuhkan bilangan bulat sebagai satu-satunya argumen dan mengembalikan penunjuk ke array. Dengan menggunakan opsi /s , Anda dapat menentukan bahwa UnknownFunction akan bekerja dengan cara yang sama seperti yang dilakukan KnownFunction . Dengan demikian, Anda dapat berhasil membuat panggilan ke UnknownFunction.