Bagaimana cara memeriksa ketergantungan DLL?

165

Kadang-kadang ketika saya melakukan proyek kecil saya tidak cukup hati-hati dan secara tidak sengaja menambahkan ketergantungan untuk DLL yang tidak saya sadari. Ketika saya mengirimkan program ini ke teman atau orang lain, "itu tidak berhasil" karena "beberapa DLL" tidak ada. Ini tentu saja karena program dapat menemukan DLL di sistem saya, tetapi tidak pada mereka.

Apakah ada cara untuk memindai executable untuk dependensi DLL atau menjalankan program dalam lingkungan bebas-bersih "DLL untuk pengujian untuk mencegah situasi oops ini?

orlp
sumber
2
Debugger menunjukkan setiap DLL yang dimuat di jendela Output. Modul Debug + Windows + menunjukkan daftar mereka. Pastikan Anda dapat menjelaskan semuanya. Dan uji pemasang Anda seperti Anda menguji kode Anda, gunakan VM.
Hans Passant
@Hans Passant: Dapatkah saya menemukan daftar lengkap jendela standar DLL di suatu tempat?
orlp
Yup, dalam c: \ windows \ system32 dengan hak cipta Microsoft.
Hans Passant
2
@ orlp - Anda mungkin juga mencoba dumpbin /dependents <program>. Saya menduga daftar akan lebih relevan daripada daftar semua DLL di %SYSTEM%atau %SYSTEM32%. Juga lihat Opsi DUMPBIN di MSDN.
jww

Jawaban:

103

Coba Dependency Walker(pembaruan terakhir pada tahun 2006) atau penulisan ulang modern yang disebut Dependencies.

Luchian Grigore
sumber
20
Saya sudah membaca bahwa ini sekarang sudah tua, adakah yang lebih mutakhir?
TankorSmash
6
Jika memungkinkan, saya hanya akan mempercayai penyedia OS asli, karena ketergantungan ddl harus merupakan pekerjaan OS .. Apakah program utilitas Microsoft dapat melakukan ini? Baris perintah baik untuk saya.
Robin Hsu
3
@RobinHsu: DependencyWalker digunakan untuk mengirim dengan Visual Studio hingga Visual Studio 2005. Build terbaru disertakan dengan Kit Pengembangan Driver Windows (dan tidak tersedia melalui situs web resmi). Masih belum secara resmi menjadi alat Microsoft, tetapi disetujui, dipromosikan, dan diiklankan oleh Microsoft.
IInspectable
8
dumpbinover walker ketergantungan. msdn.microsoft.com/en-us/library/756as972.aspx | stackoverflow.com/a/28304716/3543437
kayleeFrye_onDeck
8
Sekarang ada sumber terbuka menulis ulang sebagian dilakukan di C #, bertemu " Dependencies.exe ": github.com/lucasg/Dependencies . Tayangan uji: sedikit beta-ish , tetapi menangani API-set dan SxS tampaknya (hilang dari Dependency Walker).
Stein Åsmul
216

dumpbin dari alat Visual Studio (folder VC \ bin) dapat membantu di sini:

dumpbin /dependents your_dll_file.dll
JeffRSon
sumber
7
Alat kecil yang praktis, dan menyimpan harus menginstal sesuatu yang baru ketika Anda sudah menginstal VS.
James
13
Ya, dumpbin.exesangat berguna untuk mencari tahu /dependentsdan /imports. Anda juga dapat menggunakannya di komputer lain jika Anda menyalinnya link.exedan memastikan Visual C86 x + Runtime Redistributable ( msvcr120.dlluntuk Visual Studio 2013) yang sesuai tersedia di mesin target. Beberapa opsi memiliki dependensi tambahan. - Ngomong-ngomong, mereka mengacaukan nama opsi, itu seharusnya /PREREQUISITESbukan /DEPENDENTS, mereka seharusnya belajar bahasa Latin.
Lumi
2
Sangat bagus, kami menambahkan ini ke sistem build kami sebagai langkah verifikasi ketika executable final dihasilkan sehingga kami tidak bergantung pada sesuatu yang tidak termasuk dalam pengiriman.
Lothar
4
Satu-satunya kelemahan adalah alat praktis ini sangat tersembunyi: c: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach
1
@rkachach Jika Anda membuka baris perintah Visual Studio (Tools -> Visual Studio Command Prompt) ini dikenali sebagai perintah eksternal dan Anda hanya perlu mengetikkan "dumpbin".
Bemipefe
45

Saya dapat merekomendasikan solusi menarik untuk penggemar Linux. Setelah saya menjelajahi solusi ini, saya telah beralih dari DependencyWalker ke ini.

Anda dapat menggunakan favorit Anda lddatas Windows terkait exe, dll.

Untuk melakukan ini, Anda perlu menginstal Cygwin (instalasi dasar, tanpa paket tambahan yang diperlukan) pada Windows Anda dan kemudian mulai saja Cygwin Terminal. Sekarang Anda dapat menjalankan perintah Linux favorit Anda, termasuk:

$ ldd your_dll_file.dll

UPD: Anda dapat menggunakan lddjuga melalui terminal git bash pada Windows . Tidak perlu menginstal cygwin jika Anda sudah menginstal git.

troyane
sumber
Saya baru saja menginstal cygwin dan senang menemukan kembali perintah linux, tetapi saya tidak bisa keluar dari root Cygwin untuk mengakses file lain di drive lokal saya (C :). Apakah itu normal?
ThomasGuenet
1
Saya pikir ini bisa membantu Anda: stackoverflow.com/questions/1850920/…
troyane
4
Sayangnya, ada beberapa dependensi yang tidak ditemukan dengan cara ini: $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). Tempat sampah utilitas menunjukkan semua dependensi dengan benar.
fgiraldeau
5
Saya menggunakan ldd melalui terminal GIT BASH di windows dan berfungsi dengan baik. Jadi jika Anda memiliki git itu mudah, tidak perlu menginstal cygwin. Contoh: borkox @ bobipc MINGW64 ~ $ ldd /c/Users/borkox/.javacpp/cache/openblas-0.3.0-1.4.2-windows-x86_64.jar/org/bytedeco/javacpp/windows-x86_64/jniopenblas_nolackack ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll => / c / WINDOWS / System32 / dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov
1
Sebagai seseorang yang sudah menginstal git bash, ini adalah solusi yang lebih baik. Terima kasih!
Nicolas
28
  1. Cari tahu path file lengkap ke majelis yang Anda coba kerjakan

  2. Tekan tombol mulai, ketik "dev". Luncurkan program yang disebut "Prompt Perintah Pengembang untuk VS 2017"

  3. Di jendela yang terbuka, ketik dumpbin /dependents [path], di mana [path]jalur yang Anda temukan di langkah 1

  4. tekan tombol enter

Bam, Anda punya informasi ketergantungan Anda. Jendela akan terlihat seperti ini:

masukkan deskripsi gambar di sini

Pembaruan untuk VS 2019: Anda memerlukan paket ini dalam instalasi VS Anda:masukkan deskripsi gambar di sini

Iamsodarncool
sumber
9
  1. Ada program yang disebut "Tergantung"
  2. Jika Anda telah menginstal cygwin, tidak ada yang lebih sederhana daripada ldd file.exe
Artyom
sumber
4
Alat itu disebut Dependency Walker ; gambar yang dapat dieksekusi bernama depend.exe .
IInspectable
7
Dependency Walker diberi tanggal. Yang terakhir dibangun pada 2008!
SuB
dependstidak mendukung set API sehingga tidak berguna untuk Win7 +.
ivan_pozdeev
8

Yang paling aman adalah memiliki mesin virtual yang bersih, di mana Anda dapat menguji program Anda. Pada setiap versi yang ingin Anda uji, kembalikan VM ke nilai bersih semula. Kemudian instal program Anda menggunakan pengaturannya, dan lihat apakah itu berfungsi.

Masalah Dll memiliki wajah yang berbeda. Jika Anda menggunakan Visual Studio dan secara dinamis menautkan ke CRT, Anda harus mendistribusikan CRT DLL. Perbarui VS Anda, dan Anda harus mendistribusikan versi CRT lainnya. Hanya memeriksa dependensi saja tidak cukup, karena Anda mungkin melewatkannya. Melakukan instalasi penuh pada mesin yang bersih adalah satu-satunya solusi aman, IMO.

Jika Anda tidak ingin mengatur lingkungan pengujian full-blown dan memiliki Windows 7, Anda dapat menggunakan XP-Mode sebagai mesin pembersih awal, dan XP-More untuk menduplikasi VM.

eran
sumber
6

Di mesin pengembangan Anda, Anda dapat menjalankan program dan menjalankan Sysinternals Process Explorer . Di panel bawah, ini akan menunjukkan kepada Anda DLL yang dimuat dan jalur saat ini ke mereka yang berguna karena sejumlah alasan. Jika Anda menjalankan paket penerapan Anda, itu akan mengungkapkan DLL mana yang dirujuk di jalur yang salah (yaitu tidak dikemas dengan benar).

Saat ini, perusahaan kami menggunakan proyek-proyek Installer Visual Studio untuk menjalankan pohon dependensi dan output sebagai file longgar program. Di VS2013, ini sekarang merupakan ekstensi: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Kami kemudian mengemas file-file longgar ini dalam installer yang lebih komprehensif tetapi setidaknya proyek setup semua dependensi dot net dan menjatuhkannya ke satu tempat dan memperingatkan Anda ketika ada yang hilang.

Pisau
sumber
2

Di masa lalu (yaitu hari WinXP), saya dulu bergantung / bergantung pada DLL Dependency Walker (depend.exe) tetapi ada kalanya saya masih tidak dapat menentukan masalah DLL (s). Idealnya, kami ingin mencari tahu sebelum runtime oleh inspeksi tetapi jika itu tidak menyelesaikannya (atau mengambil terlalu banyak waktu), Anda dapat mencoba mengaktifkan "snap loader" seperti yang dijelaskan pada http://blogs.msdn.com/ b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspx dan https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx dan secara singkat disebutkan LoadLibrary gagal; GetLastError tidak membantu

PERINGATAN: Saya telah mengacaukan Windows saya di masa lalu bermain-main dengan gflag membuatnya merangkak ke lutut, Anda telah diperingatkan sebelumnya.

masukkan deskripsi gambar di sini

Catatan: "Loader snap" adalah per-proses sehingga UI aktif tidak akan tetap diperiksa (gunakan cdb atau glfags -i)

HidekiAI
sumber
2

NDepend sudah disebutkan oleh Jesse (jika Anda menganalisis kode .NET) tetapi mari kita jelaskan bagaimana itu bisa membantu.

Apakah ada program / skrip yang dapat memindai yang dapat dieksekusi untuk dependensi DLL atau menjalankan program dalam lingkungan bebas-bersih "DLL untuk pengujian untuk mencegah situasi oops ini?

Di panel Properti Proyek NDepend, Anda dapat menentukan apa yang rakitan aplikasi untuk dianalisis (berwarna hijau) dan NDepend akan menyimpulkan rakitan Pihak Ketiga yang digunakan oleh aplikasi tersebut (berwarna biru). Daftar direktori tempat mencari aplikasi dan majelis pihak ketiga disediakan.

Aplikasi Properti Proyek NDepend dan majelis Pihak Ketiga

Jika perakitan pihak ketiga tidak ditemukan di direktori ini, itu akan berada dalam mode kesalahan. Sebagai contoh jika saya menghapus direktori .NET Fx C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319saya bisa melihat bahwa .NET Fx pihak ketiga tidak diselesaikan:

Aplikasi Properti Proyek NDepend dan majelis Pihak Ketiga tidak terselesaikan

Penafian: Saya bekerja untuk NDepend

Patrick dari tim NDepend
sumber
1

Silakan cari "depend.exe" di google, ini adalah utilitas kecil untuk menangani ini.

shiying yu
sumber
7
Perhatikan bahwa dependensi walker cukup tanggal, dan tidak bekerja dengan baik dengan 64 bit. Ini secara definitif akan menunjukkan semua DLL dependen, yang dicari OP, tetapi juga menambahkan noise - Anda akan menemukan Anda 32 bit dieksekusi kehilangan 64 bit dll dan seterusnya ... Sayangnya, masih tidak ada yang lebih baik alternatif.
eran
@eran Bagaimana dengan sekarang? Apakah ada alternatif yang lebih baik sekarang? Terima kasih.
Nikos
@ RestlessC0bra Bukan yang saya tahu, tapi saya belum melakukan pengembangan Windows selama 5 tahun terakhir. Ketergantungan walker sudah pasti mati, dan itu memalukan Microsoft tidak peduli untuk memperbarui alat yang berguna ini atau membuka sumbernya sehingga orang lain dapat tetap hidup.
eran
1
@eran No DW tidak mati. Ternyata masih digunakan secara luas. Ada beberapa alat lain, tetapi DW mungkin masih yang terbaik.
Nikos
@ RestlessC0bra: Dependency Walker sudah mati. Itu tidak pernah berhasil dengan modul 64-bit. Jika Anda melihat dari dekat, banyak dari penggunaan ekstensif Dependency Walker mengarah ke pertanyaan Stack Overflow, menanyakan mengapa sesuatu terjadi. Tapi sesuatu itu tidak pernah terjadi. Itu hanya false negative / positif. Monitor Proses harus menjadi alat pilihan Anda.
IInspectable
1

Jika Anda memiliki kode sumber, Anda dapat menggunakan ndepend.

http://www.ndepend.com/

Ini mahal dan melakukan lebih dari menganalisis dependensi sehingga mungkin berlebihan untuk apa yang Anda cari.

Jesse
sumber
3
Menjadi alat yang dirancang khusus untuk .NET, apakah itu menganalisis dependensi untuk gambar asli juga?
IInspectable
Mungkin tidak, @Inspectable. Saya tidak berpikir. NET memiliki cara untuk melakukan itu, kecuali mungkin menggunakan sesuatu P-Invoke.
kayleeFrye_onDeck
@kayleeFrye_onDeck: Parsing tabel impor bermuara pada membaca file. .NET dapat membaca file.
IInspectable
Ya! Namun, tidak ada. NET API untuk melakukan ini :( Apa yang Anda sarankan? Saya bukan programmer .NET, hanya seseorang yang menggunakannya ketika solusi tingkat yang lebih rendah tidak berjalan dengan baik. Ada beberapa pilihan alat inspeksi yang layak di luar sana, tetapi sangat sedikit untuk Windows yang ramah distribusi, apalagi cepat ... Saya ingin menggunakannya untuk memeriksa jumlah biner yang tidak diketahui secara rekursif untuk mendeteksi kerangka kerja yang digunakan saat dikompilasi, sehingga saya bisa memperlakukannya dengan params khusus. Saya mungkin harus melihat ke dalam menggunakan LoadLibraryEx...
kayleeFrye_onDeck
1
@kayleeFrye_onDeck: Tidak ada apa pun di API Windows untuk membaca tabel impor modul. Anda harus membaca file dan mem-parsing isinya. Tidak ada perbedaan antara kode asli dan .NET. LoadLibraryExtidak membantu di sana.
IInspectable
0

Proyek pedeps ( https://github.com/brechtsanders/pedeps ) memiliki alat baris perintah (copypedeps) untuk menyalin file .exe (atau .dll) Anda bersama dengan semua file yang bergantung padanya. Jika Anda melakukannya pada sistem di mana aplikasi bekerja, Anda harus dapat mengirimkannya dengan semua DLL ketergantungannya.

Brecht Sanders
sumber