Pertanyaan Apakah ada cara di C / C + + untuk mendeteksi apakah kode berjalan selama inisialisasi statis?


Saya sedang menulis pustaka penelusuran yang tersedia sebagai DLL. Itu dikonsumsi oleh dasarnya setiap komponen dalam sistem saya. Salah satu persyaratan yang rumit adalah bahwa fungsi pelacakan perlu dipanggil sangat awal dalam proses seumur hidup, bahkan sebelum main () berjalan.

Konsumen perpustakaan ini termasuk executable, DLL yang terhubung secara statis, DLL yang tertunda dan DLL yang dimuat secara dinamis. Semua variasi.

Beberapa fitur pelacakan tidak berfungsi dengan baik dengan inisialisasi statis tetapi yang lain baik-baik saja. Idealnya, saya ingin dapat menawarkan kepada konsumen fungsi yang aman minimal selama waktu init dan kemudian fungsionalitas penuh setelah init selesai.

Meminta konsumen untuk membuat eksplisit "Saya selesai init" menyebut diri mereka tidak berfungsi karena fakta bahwa konsumen tertentu adalah DLL sendiri dan tidak memiliki kendali atas hosting yang dapat dieksekusi. Masalah yang sama hanya bergerak satu tingkat ke atas rantai.

Yang saya harapkan adalah bahwa ada beberapa cara bagi saya untuk menanyakan runtime apakah saya sedang menjalankan inisialisasi statis atau apakah tahapan itu selesai. Apakah hal semacam itu mungkin?

Untuk memperumit masalah lebih lanjut, saya harus berjalan di 5 platform. Saya tidak memerlukan solusi write-once tetapi saya harus membuatnya bekerja di semua platform.


4
2017-07-20 16:31


asal


Jawaban:


Variabel global? Sesuatu seperti:

bool initTime = true;

di DLL Anda dan kemudian

int main()
{
  initTime = false;
  // your main code comes here
}

di eksekusi Anda.


1
2017-07-20 20:01



Anda menulis itu

Beberapa fitur penelusuran tidak berfungsi dengan baik   dengan inisialisasi statis tetapi yang lain   baik-baik saja.

Namun, sebagian besar waktu masalahnya tidak terletak pada fase inisialisasi statis dari yang dapat dieksekusi (proses), tetapi dalam fase inisialisasi statis dari / a DLL. Anda harus menyadari bahwa setiap DLL memiliki fase inisialisasi statis sendiri untuk itu objek C ++ statis. Khususnya Anda melacak DLL juga, dan begitu juga DLL lain yang mungkin menggunakan DLL Anda.

Singkatnya: Mungkin Anda tidak peduli jika fase inisialisasi statis dari eksekusi sudah selesai tetapi Anda melakukan peduli jika a) DLL Anda sendiri telah selesai melakukan inisialisasi dan b) jika saat memanggil DLL Anda, Loader Lock saat ini ditahan.

Seperti a) Jika DLL Anda selesai menginisialisasi hanya masalah di dalam kode Anda karena tidak ada yang dapat memanggil ke DLL Anda sebelum diinisialisasi.

Seperti b) Tampaknya tidak ada (portabel, didokumentasikan) cara untuk menentukan dari kode jika kunci loader saat ini sedang diadakan. Saya tidak tahu cara lain selain untuk mendokumentasikan dengan jelas fungsi apa yang tidak boleh dipanggil ketika Lock Loader sedang ditahan.


0
2017-07-21 15:22



Anda mungkin harus menulis ulang (baik, memodifikasi) dan kemudian menghubungkan dengan crt0.o. Itu jelas harus berbeda untuk setiap platform.


0
2017-07-21 16:18