2015-04-10 20 views
11

Bir C++11 yazılımı yazıyorum ve lambdas kullanıyorum. Backtrace'i backtrace_symbols_fd ile yazdırdığımda, tüm işlevler lambda dışında parçalara ayrılır. Anonim işlevler olduklarından biraz apaçık, ama ham bir işaretçi yerine daha fazla kavrayış elde etmenin bir yolu var mı?Lambda işlevlerini geriye doğru nasıl gösterebilirim?

C++ standart göre

+2

Bunu görmek istediğiniz bağlamda (debugger? Toolchain?) Söz etmek yararlı olabilir. – MSalters

+0

Evet, hangi derleyiciyi ve hata ayıklayıcısını kullanıyorsunuz? – LThode

+0

@MSalters tamamlandı, teşekkürler –

cevap

0

Linux GCC 4.8 kullanıyorum:

§5.1.2/3 durumları:

lambda ifade tipi (bir Ayrıca kapatma nesnesinin türü benzersiz, adsız bir sınıf dışı sınıf türüdür.

Daha yararlı bilgiler edinmenin bir yolu olduğunu sanmıyorum. Temel olarak, lambdalar anonim sınıfların örnekleridir.

+0

Bu isim, kullanıcılar tarafından söylenemez olsa bile, bağlantı ve isim mandallama amaçları için hala bir çeşit adaya ihtiyaç duyarlar. Örneğin. Bir şablonun bir kapanış türüyle başlatılması durumunda, derleyicinin şablon uzmanlaşmasının mandallı adında kapatma türünü kodlaması gerekir. –

2

İkilde bir çeşit faydalı bilgi vardır, çünkü GDB lambda işlevleri için daha kullanışlı isimler gösterebilir örn.

(gdb) bt 
#0 <lambda()>::operator()(void) const (__closure=0x7fffffffd5ef) at ll.cc:3 
#1 0x00000000004005e7 in main() at ll.cc:3 

kapatma tipiyle örneği bir şablonun parçalanmış adı benzersiz bir ad örn içermektedir (belki hata ayıklama bilgisi sadece GDB <lambda()>::operator() olarak tüm bu fonksiyonları gösterir gibi, kapalı tip söylüyor rağmen)

#3 0x0000000000400712 in func<main()::<lambda()> >(<lambda()>) (t=...) at l.cc:4 

ama

belki diğer parçalanmış adlarında ihtiyaç duyulduğunda sadece kullanılan ad. GCC ile

de yazdırarak kapatma en operator() adına yazdırabilirsiniz önceden tanımlanmış değişken __PRETTY_FUNCTION__, ben aynı kapatılması için bir başka isim alabilirsiniz GDB Python API kullanarak main()::<lambda()>

gibi bir şey gösteren, Örneğin

(gdb) python import gdb; print gdb.block_for_pc(0x8048591).function.name 
__lambda0::operator()() const 

Bu en az üç farklı ad! Bu yüzden belki de backtrace_symbols_fd'un lambda işlevleri için isimleri bulamadığı bir sınırlama olduğunu düşünüyorum.

İlgili konular