2017-05-31 21 views
6

de C++ ifadeleri değerlendiriyor. Örneğin, aşağıdaki kodla:Nasıl GDB Geçenlerde GDB bir program ayıklarken "karmaşık" ifadeleri değerlendirmek yeteneğine sahip olduğunu fark ettim ve o bunu nasıl merak ediyorum, zamanında

int main() { 
    std::vector<int> v = {1, 2, 3}; 
    int k = 0; 
    std::cin >> k; 
    v.push_back(k); 
    return v.at(0); 
} 

Bana (k girilen dinamik sonra doğru değeri yazdırır) print v.at(4); gibi noktaları print v.at(2) == 3 yazabildiği programı g++ -g myprogram.cpp ve GDB içinde hata ayıklama derlemek mümkün duyuyorum doğru olarak değerlendirir. Ben GDB bunu nasıl merak ediyorum

. This SO question, "bellekte derlenmiş" bir şey olduğunu ama daha fazla ayrıntı vermediğini ima ediyor, bu yüzden tüm bunları ya da başka bir şeyi yapmak için bir çeşit JIT kullanmasını mı merak ediyorum? Yazarken ve çalıştırırken kod satır içi derliyorlar mı? Hata ayıklama bağlamında C++'yi değerlendirmek için bir çerçeve var mı? Özünde, bu noktada yazım hatalarımdaki ifadeleri değerlendirmek için yazdığım bir hata ayıklayıcıda çoğaltmak istiyorum, bu yüzden GDB'nin bunu nasıl yaptığını merak ediyorum. Bana baskı v.at gibi şeyler yazabildiği

+1

Ne tür bir cevap almayı umduğum belli değil. Gdb, hata ayıklama programı bağlamında C ve C++ ifadelerini, ikili içerisindeki hata ayıklama bilgilerinin yardımıyla ve ayrıca kullanılabilir olduğunda kaynak kodunun kullanımıyla analiz edebilir. Ama bunu zaten biliyordunuz ve detaylar bu mekan için çok uzun olacaktır. –

+0

@JohnBollinger "Kaynağı kullanmam" gerekeceğini düşündüm, ama merak ettiğim şey ifadeleri nasıl değerlendiriyorlar. Yazarken ve çalıştırırken kod satır içi derliyorlar mı? Hata ayıklama bağlamında C++'yi değerlendirmek için bir çerçeve var mı? Özünde, bu noktada yazım hatalarımdaki ifadeleri değerlendirmek için yazdığım bir hata ayıklayıcıda çoğaltmak istiyorum, bu yüzden GDB'nin bunu nasıl yaptığını merak ediyorum. Teşekkürler! – llk

+0

Sorunuz daha fazla C++ odaklı görünüyor. C etiketini kaldırmanızı tavsiye ederim. – tambre

cevap

5

Kısa Cevap: Bu kod derleme yapmaz.

Uzun Cevap:

  1. Sen print komut arayıp prosedür hedef hafızasını okuyup için gdb içine hesaplayarak bir ifadeyi değerlendirir eval.c tanımlanan O evaluate_expression çağırır printcmd.c
  2. , meydana Standart operatörler, aksi halde call_function_by_hand kullanın.
  3. call_function_by_hand, infcall.c numaralı belgede tanımlanmıştır. Çağrıldığında, yordam, hedef yürütmeyi durdurur (bazen yoktur, bu nedenle bu özellik ile çok iş parçacıklı bir programın çökmesi mümkündür).
  4. Hata ayıklama programına kodu enjekte edin.
  5. Sonucu, belleği okuyarak alın ve gerekirse duraklatın.

Daha iyi anlaşılması için call_function_by_hand koduna odaklanabilirsiniz.

Not: compileprint/call farklı bir şeydir.

Komple Cevap: Birkaç gün içinde

, ben GDB ileri okuma için bu özelliği, nasıl uyguladığını ayrıntılı analizini yazabilirsiniz.

6

(4);

gdb ikili derlenmiş işlevleri çağırabilir. Bu tam olarak burada olan şey. gdb, üye işlevini at() numaralı telefondan arar ve sonucu sizin için yazdırır, bkz. documentation.

Ayrıca kodunuzda v.at(0) kullandığınız nedeniyle bu mümkün olduğunu unutmayın. Kodun bu bölümünü kaldırırsanız, v.at() başlatılamaz ve sonuçta oluşan ikilide kullanılamaz, böylece gdb onu arayamazdı.

+0

Bu yüzden GDB hiçbir şey derlemiyor, aksine ifadeleri değerlendirmek için mevcut kodun bölümlerini çalıştırıyor? GDB'nin bunu yapmak için kullandığı bir kütüphane var mı yoksa tamamen bağımsız bir şekilde kodlanmış mı? – llk

+1

Evet, gönderdiğiniz örnekte. Ancak, bu özelliği kullanmamasına rağmen kodu derleyebilir ve enjekte edebilir, bkz. Https://sourceware.org/gdb/onlinedocs/gdb/Compiling-and-Injecting-Code.html#Compiling-and-Injecting-Code. – ks1322