Soru Bir ikili sürümün hem win hem de * nix'de serbest bırakılması veya hata ayıklaması olup olmadığını nasıl anlarsınız?


Sürüm veya hata ayıklama sürümleri olup olmadığını anlamak için yürütülebilir ve dinamik kitaplıklar gibi ikili dosyaları incelemek için basit bir komut satırı yardımcı programı var mı? * Nix veya Windows'da böyle bir şey var mı?


32
2018-04-30 17:23


Menşei


Hangi diller için? Hangi hata ayıklama biçimleri için?
"Debug" ve "Release" özel anlamları yoktur; Farklı projelerde farklı olabilecek bir seçenekler kümesine atıfta bulunmanın sadece yollarıdır. Bir şeyin hata ayıklama sembolleriyle oluşturulup oluşturulmadığını ve kullanılmamasını mı istediniz? - smorgan
* Bir şeyin hata ayıklama sembolleriyle oluşturulup oluşturulmadığını ve kullanılmamasını mı istediniz? * Evet.
Olası kopya Bir kütüphanenin -g ile derlenmiş olup olmadığını nasıl anlarım? - Ciro Santilli 新疆改造中心 六四事件 法轮功


Cevaplar:


  • C ++ için Linux, yapabilirsin:

        objdump --source yourbin |grep printf
    

    Printf'i, yaptığınız işlev çağrısı ile değiştirin. Hata ayıklanıyorsa, yaptığınız tüm gerçek kaynak kodu çağrısını görüntüler. Serbest bırakılırsa, sembol sembolünden kurulu sembolü gösterir.

  • C ++ için , Windows, depends.exe'yi kullanabilir ve MSVCRT'ye (release) veya MSVCRTD'ye (debug) bağlı olup olmadığına bakın.


29
2018-03-16 18:38



Bu işe yaramazsa emin değilim objdump --source hello32* | grep printf bunda gcc -m32 -g -o hello32_dbg hello.c ve bu dava gcc -m32 -o hello32 hello.c hiçbir şey döndürmez - Wakan Tanka
Sadece kontrol et, merhaba.c'de printf'i ararsın mı? - Bob Yoplait
Acı kovanı kullanıyordum - Wakan Tanka
Windows (MS derleyicileri) için, aramanız gereken DLL dosyasının adı, karşı karşıya olduğunuz C ++ çalışma zamanının sürümüne bağlıdır (çoğunlukla Visual Studio'nun sürümüne bağlıdır). DLL adları on yıldan fazla bir süredir MSVCRT / MSVCRTD olmamıştır. - Euro Micelli


Linux üzerinde dinamik kütüphaneler için bile "dosya" komutunu kullanabilirsiniz. Tüm hata ayıklama sembollerinden sıyrılan "soyuldu" yazıyorsa. "Soyulmamış" diyorsa, bunun tam tersidir.


17
2018-04-30 17:33



Soyulmamış bir sürüm veya soyulmuş bir hata ayıklama yapısına sahip olmak mümkündür. - leander
Sürüm veya hata ayıklama yapısıyla ne demek istediğinden emin değilim. Bir program / kütüphanenin hata ayıklama için hata ayıklama sembolleri ile oluşturulacağını ve gönderi için sıyrılacağını varsaydım. Bu nedenle hata ayıklama veya yayınlama, kullandığınız şekilde örtülüdür. Her kombinasyona sahip olabilirsiniz, çünkü paketlemenize bağlı olarak değişir. - Norbert Hartl
doğru değil, sıyırma sembolleri hata ayıklama veya yayın sürümlerinden bağımsızdır - Bob Yoplait
Solaris üzerinde de çalışır - Andrejs
stackoverflow.com/questions/22682151/... - parasrish


Unix için: ELF çalıştırılabilir ile kullanmak mümkün olabilir objdump veya mil Yürütülebilir dosya için sembol tablolarına bakmak için (bu durumun, soyulmadığında çok daha iyi çalışacağını unutmayın). Belirli sembollerin varlığı veya yokluğu bir hata ayıklama veya yayın oluşturma belirtisi gösterme eğiliminde olacaktır. (Bu, büyük olasılıkla, hangi kütüphaneleri kullandığınıza bağlıdır, vb. Ortak olanları bulmak için biraz kazı yapmak zorunda olmalısınız, yorumlarda aramayla ilgili önerilerde bulunmaktan çekinmeyin; Cevap.)

Pencereler için: dependencywalker önerileri iyidir. Komut satırı eşdeğerleri için dumpbin Çoğu Visual Studio yüklemesinde ve * nix'de objdump'a biraz denktir. Ayrıca, bir nm veya objdump'ı da bulabilirsiniz. bazı windows exe dosyalarında çalışacak msys veya cygwin.


3
2018-04-30 17:43



Kullandığım Mac OS X’de yeniyim. Ama görünüşe göre objdump Xcode ile gelmiyor. nm kullanılabilir ancak görebildiğim tek fark, hata ayıklama sürümünün çok daha fazla şey içermesidir.


Windows için Bağımlılık Walker exe yüklerinin (ve bağımlılıklarının) her dll'si için isteğe bağlı cmd-line çıktı listesi vardır. Bunu grep ile çalıştırın ve bir d ile msvcrt-dll popups olup olmadığını görün.

Bu sadece dinamik olarak bağlantılıysa çalışır. Aksi takdirde daha zor olabilir.

Hata ayıklama / yayınlamada farklı olan belirli işlevler için belki de grep olabilirsiniz. Eğer bu dizeler yürütülebilir dosyada görülebilir.

Uygulamalarınız çalışma zamanını hiç kullanmazsa, oldukça zor olur.


3
2018-04-30 17:33



MsvcrtD'ye bağlı olmak, hata ayıklama bilgisine sahip olmakla aynı şey değildir ... - André
@Andre Hata ayıklama bilgisine sahip olmak, hata ayıklama veya sürümde oluşturulmakla aynı şey değildir. Ne demek istiyorsun? - Macke
Yukarıdaki leander ve smorgan tarafından yorumlara bakın. Soyulmamış bir sürüm oluşturmanın yanı sıra bir hata ayıklama yapısını da kırpmak mümkündür. "Debug" ile "Release" arasındaki ayrım biraz belirsiz. Bazı insanlar için, ör. "Hata Ayıkla", şu anlama gelir: hata ayıklama çalışma zamanını agains. Diğerleri için, "NDEBUG tanımlanmadan inşa edilmiş olabilir. Ve diğerleri için şu anlama gelebilir: Optimize edilmemiş veya sadece: hata ayıklama sembolleriyle. - André


Devam edecek fazla bir şey yok. Reflektörde bir montaj açarsanız, Montaj Niteliğine bakabilirsiniz:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)]

Ama görünüşe göre bu, serbest bırakma moduna da eklendi.

Eğer kendi meclisiniz çözümdense, bazı önişlemci direktiflerini kullanmaktır.

#ifdef DEBUG
[MyAttribute("foo")]
#endif

düzenleme: Üzgünüm, .NET'i kabul ettim. Çekicem gider.


2
2018-04-30 17:34



.NET'i aldığına sevindim çünkü bu beni buraya getirdi ve cevabınız beni doğru yöne işaret etti. VS2010'da, öznitelik hem Hata Ayıklama hem de Sürüm derlemelerinde bulunur, ancak "liste" argümanı farklıdır. - Piotr Owsiak


Çoğu zaman, hem yürütülebilir dosyaların hem de kitaplıkların hata ayıklama sürümleri, çalışma zamanının hata ayıklama sürümüyle ilişkilendirilir. Windows üzerinde, bazıları takip eden hata ayıklama / yayın sürümleri için bir ad düzeni vardır. Bir kitaplığın hata ayıklama sürümünün adı d ile bitmelidir. Bağımlılık Walker gibi bir araç kullanabilirsiniz.http://www.dependencywalker.comUygulamanızın veya kitaplığınızın hangi kitaplıklara bağlı olduğunu görmek için. Çalışma zamanı kitaplıklarının hata ayıklama sürümlerini bulursanız, yürütülebilir dosyanızın veya kitaplığınızın hata ayıklama modunda büyük bir şansı vardır.

Ancak bu sadece çalışırsa

  • ismine bakarak anlatabilirsin çalışma zamanı hangi sürüm (bu gibi bazı isimlendirme şemasını takip eder yukarıda anlattığım bir tane)
  • çalıştırılabilir / kitaplığınız bağlandı dinamik çalışma zamanına karşı statik değil bir. İkinci durumda çalışma zamanı çalıştırılabilir / kütüphaneye çekilir ve artık bağımlılık değil
  • Windows'dasın :)

2
2018-04-30 17:39





Filever.exe'yi kullanabilirsiniz.

filever.exe <my binary file>
--a-- W32i   APP   -         1.0.0.0 shp     25,600 11-03-2013 <my file>

Filever almak için windows xp için destek araçlarını indirebilirsiniz.

Windows 7 veya daha yukarısına taşındıysanız (çoğu pencere kullanıcısı gibi), indirebilir, winzip ile açabilirsiniz.

Daha sonra, support.cab'den filever ayıklayın.

Windows 7 için gayet iyi çalışıyor.


0
2017-11-03 13:55





Hangi sürümü olduğunu öğrenmek için depends.exe'yi kullanın. Dosyayı açıp yürüdüğünüzde, gerekli olan dosyayı gösterecektir. System32 dosyalarının listesini görerek, hata ayıklama veya bırakma olup olmadığını görebilirsiniz.


0
2018-04-18 07:05