Làm thế nào để kiểm tra sự phụ thuộc DLL?


165

Đôi khi, khi tôi đang thực hiện một dự án nhỏ, tôi không đủ cẩn thận và vô tình thêm một phụ thuộc cho một DLL mà tôi không biết. Khi tôi gửi chương trình này cho bạn bè hoặc người khác, "nó không hoạt động" vì "một số DLL" bị thiếu. Điều này là tất nhiên bởi vì chương trình có thể tìm thấy DLL trên hệ thống của tôi, nhưng không phải trên hệ thống của họ.

Có cách nào để quét một tệp thực thi cho các phụ thuộc DLL hoặc thực thi chương trình trong môi trường không có DLL "sạch" để kiểm tra để ngăn chặn các tình huống rất tiếc này không?


2
Trình gỡ lỗi hiển thị mọi DLL được tải trong cửa sổ đầu ra. Các mô-đun gỡ lỗi + Windows + hiển thị một danh sách của chúng. Hãy chắc chắn rằng bạn có thể chiếm tất cả chúng. Và kiểm tra trình cài đặt của bạn giống như bạn kiểm tra mã của mình, sử dụng VM.
Hans Passant

@Hans Passant: Tôi có thể tìm thấy một danh sách đầy đủ các cửa sổ DLL tiêu chuẩn ở đâu đó không?
orlp

Yup, trong c: \ windows \ system32 có bản quyền của Microsoft.
Hans Passant

2
@orlp - Bạn cũng có thể thử dumpbin /dependents <program>. Tôi đoán danh sách này sẽ phù hợp hơn là liệt kê tất cả các DLL trong %SYSTEM%hoặc %SYSTEM32%. Đồng thời xem Tùy chọn DUMPBIN trên MSDN.
jww

Câu trả lời:


103

Hãy thử Dependency Walker(bản cập nhật cuối cùng trong năm 2006) hoặc viết lại hiện đại của nó được gọi là Dependencies.


20
Tôi đã đọc rằng điều này hiện đang tồn tại, có gì mới hơn không?
TankorSmash

6
Nếu có thể, tôi sẽ chỉ tin tưởng nhà cung cấp hệ điều hành gốc, vì phụ thuộc ddl phải là công việc của hệ điều hành .. Có chương trình tiện ích nào của Microsoft có thể làm điều này không? Dòng lệnh là tốt cho tôi.
Robin Hsu

3
@RobinHsu: DependencyWalker được sử dụng để giao hàng với Visual Studio cho đến Visual Studio 2005. Bản dựng gần đây nhất được bao gồm trong Bộ phát triển trình điều khiển Windows (và không có sẵn thông qua trang web chính thức). Vẫn chưa chính thức là một công cụ của Microsoft, nhưng đã bị Microsoft xử phạt, quảng bá và quảng cáo.
IInspectable


8
Hiện tại đã có một mã nguồn mở viết lại một phần được thực hiện trong C #, đáp ứng " Dependencies.exe ": github.com/lucasg/Dependencies . Ấn tượng thử nghiệm: một chút beta-ish , nhưng nó xử lý các bộ APISxS rõ ràng (thiếu từ Dependency Walker).
Stein smul

215

dumpbin từ các công cụ Visual Studio (thư mục VC \ bin) có thể trợ giúp tại đây:

dumpbin /dependents your_dll_file.dll

7
Công cụ nhỏ tiện dụng và tiết kiệm phải cài đặt bất cứ thứ gì mới khi bạn đã cài đặt VS.
James

13
Vâng, dumpbin.exerất hữu ích để tìm ra /dependents/imports. Bạn cũng có thể sử dụng nó trên các máy khác nếu bạn sao chép link.execùng với nó và đảm bảo x86 Visual C ++ Runtime Redistributablemsvcr120.dll tương ứng ( cho Visual Studio 2013) có sẵn trên máy đích. Một số tùy chọn có phụ thuộc bổ sung. - Nhân tiện, họ đã vặn tên tùy chọn, đáng lẽ ra nó phải /PREREQUISITESthay vì /DEPENDENTS, họ nên học tiếng Latin.
Lumi

2
Thật tuyệt vời, chúng tôi đã thêm nó vào hệ thống xây dựng của mình như một bước xác minh khi thực thi cuối cùng được tạo để chúng tôi không phụ thuộc vào thứ gì đó không có trong vận chuyển.
Lothar

4
Hạn chế duy nhất là công cụ hữu ích này là rất ẩn: c: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Cộng đồng \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach

1
@rkachach Nếu bạn mở dòng lệnh Visual Studio (Công cụ -> Dấu nhắc lệnh của Visual Studio) thì đây được nhận dạng là một lệnh bên ngoài và bạn chỉ cần nhập "dumpbin".
Bemipefe

45

Tôi có thể đề xuất giải pháp thú vị cho người hâm mộ Linux. Sau khi tôi khám phá giải pháp này, tôi đã chuyển từ DependencyWalker sang giải pháp này.

Bạn có thể sử dụng yêu thích của bạn lddtrên Windows exe, dll.

Để làm điều này, bạn cần cài đặt Cygwin (cài đặt cơ bản, không cần gói bổ sung) trên Windows của bạn và sau đó chỉ cần bắt đầu Cygwin Terminal. Bây giờ bạn có thể chạy các lệnh Linux yêu thích của mình, bao gồm:

$ ldd your_dll_file.dll

CẬP NHẬT: Bạn cũng có thể sử dụng lddthông qua git bash terminal trên Windows . Không cần cài đặt cygwin trong trường hợp nếu bạn đã cài đặt git.


Tôi chỉ cài đặt cygwin và rất vui khi tìm lại các lệnh linux, nhưng tôi không thể thoát khỏi root Cygwin để truy cập các tệp khác trên ổ đĩa cục bộ của mình (C :). Điều đó có bình thường không?
ThomasGuenet

1
Tôi nghĩ rằng điều này có thể giúp bạn: stackoverflow.com/questions/1850920/ từ
troyane

4
Thật không may, có một số phụ thuộc không được tìm thấy theo cách này : $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). Các thùng rác tiện ích hiển thị tất cả các phụ thuộc chính xác.
fgiraldeau

5
Tôi sử dụng ldd thông qua thiết bị đầu cuối GIT BASH trên windows và hoạt động tốt. Vì vậy, nếu bạn có git nó sẽ dễ dàng, không cần phải cài đặt cygwin. Ví dụ: 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 ntdll.dll => /c/WINDOWS/SYIUS32/ntdll.dll (0x7ffe46910000) KernEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE / System dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov

1
Là một người đã cài đặt git bash, đây là một giải pháp thích hợp hơn. Cảm ơn bạn!
Nicolas

27
  1. Tìm ra đường dẫn tệp đầy đủ đến cụm mà bạn đang cố gắng làm việc với

  2. Nhấn nút bắt đầu, gõ "dev". Khởi chạy chương trình có tên "Nhắc lệnh của nhà phát triển cho VS 2017"

  3. Trong cửa sổ mở ra, gõ dumpbin /dependents [path], đâu [path]là con đường bạn đã tìm ra ở bước 1

  4. nhấn phím enter

Bam, bạn đã có thông tin phụ thuộc của bạn. Cửa sổ sẽ trông như thế này:

nhập mô tả hình ảnh ở đây

Cập nhật cho VS 2019: bạn cần gói này trong cài đặt VS của bạn:nhập mô tả hình ảnh ở đây


9
  1. Có một chương trình gọi là "Phụ thuộc"
  2. Nếu bạn đã cài đặt cygwin, không có gì đơn giản hơn thì ldd file.exe

4
Công cụ này được gọi là Dependency Walker ; hình ảnh thực thi của nó được đặt tên là phụ thuộc .
IInspectable

7
Walker phụ thuộc là ngày. Nó được xây dựng lần cuối là vào năm 2008!
SuB

dependskhông hỗ trợ các bộ API nên Win7 + vô dụng.
ivan_pozdeev

8

Điều an toàn nhất là có một số máy ảo sạch, trên đó bạn có thể kiểm tra chương trình của mình. Trên mọi phiên bản bạn muốn kiểm tra, hãy khôi phục VM về giá trị sạch ban đầu. Sau đó cài đặt chương trình của bạn bằng cách sử dụng thiết lập của nó và xem nó có hoạt động không.

Vấn đề dll có khuôn mặt khác nhau. Nếu bạn sử dụng Visual Studio và tự động liên kết với CRT, bạn phải phân phối các tệp CRT DLL. Cập nhật VS của bạn và bạn phải phân phối một phiên bản CRT khác. Chỉ kiểm tra các phụ thuộc là không đủ, vì bạn có thể bỏ lỡ những phụ thuộc. Thực hiện cài đặt đầy đủ trên máy sạch là giải pháp an toàn duy nhất, IMO.

Nếu bạn không muốn thiết lập môi trường kiểm tra toàn diện và có Windows 7, bạn có thể sử dụng XP-Mode làm máy sạch ban đầu và XP-More để sao chép VM.


6

Trên máy phát triển của bạn, bạn có thể thực thi chương trình và chạy Sysiternals Process Explorer . Trong khung bên dưới, nó sẽ hiển thị cho bạn các DLL được tải và các đường dẫn hiện tại tới chúng, rất tiện cho một số lý do. Nếu bạn đang thực hiện gói triển khai của mình, nó sẽ tiết lộ DLL nào được tham chiếu sai đường dẫn (nghĩa là không được đóng gói chính xác).

Hiện tại, công ty chúng tôi sử dụng các dự án Visual Studio Installer để đi bộ cây phụ thuộc và xuất ra các tệp chương trình lỏng lẻo. Trong VS2013, đây hiện là một tiện ích mở rộng: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Sau đó, chúng tôi đóng gói các tệp lỏng lẻo này trong một trình cài đặt toàn diện hơn nhưng ít nhất là thiết lập đó dự án tất cả các phụ thuộc mạng chấm và thả chúng vào một vị trí và cảnh báo bạn khi thiếu thứ gì đó.


2

Trước đây (tức là WinXP ngày), tôi đã từng phụ thuộc / dựa vào DLL Dependency Walker (Dep.exe) nhưng có những lúc tôi vẫn không thể xác định (các) sự cố DLL. Lý tưởng nhất, chúng tôi muốn tìm hiểu trước khi chạy bằng cách kiểm tra nhưng nếu điều đó không giải quyết được (hoặc mất quá nhiều thời gian), bạn có thể thử bật "trình tải snap" như được mô tả trên http://bloss.msdn.com/ b / Junfeng / archive / 2006/11/20 / debugging-loadl Library-failures.aspxhttps://msdn.microsoft.com/en-us/l Library / windows / hardware / f5555886 (v = vs85) .aspx và đã đề cập ngắn gọn về LoadL Library không thành công; GetLastError không giúp đỡ

CẢNH BÁO: Tôi đã làm hỏng Windows của mình trong quá khứ đánh lừa bằng gflag khiến nó bò đến đầu gối, bạn đã được cảnh báo trước.

nhập mô tả hình ảnh ở đây

Lưu ý: "Snaper snap" là mỗi quy trình để cho phép UI không được kiểm tra (sử dụng cdb hoặc glfags -i)


2

Jesepend đã được đề cập bởi Jesse (nếu bạn phân tích mã .NET) nhưng hãy giải thích chính xác làm thế nào nó có thể giúp đỡ.

Có một chương trình / tập lệnh nào có thể quét một tệp thực thi cho các phụ thuộc DLL hoặc thực thi chương trình trong một môi trường không có DLL "sạch" để kiểm tra để ngăn chặn các tình huống oops này không?

Trong bảng Thuộc tính Dự án NDepend, bạn có thể xác định các cụm ứng dụng cần phân tích (màu xanh lá cây) và NDepend sẽ suy ra các cụm bên thứ ba được sử dụng bởi các ứng dụng (màu xanh lam). Một danh sách các thư mục nơi tìm kiếm ứng dụng và hội đồng bên thứ ba được cung cấp.

Ứng dụng thuộc tính dự án NDepend và hội đồng bên thứ ba

Nếu không tìm thấy lắp ráp bên thứ ba trong các thư mục này, nó sẽ ở chế độ lỗi. Ví dụ: nếu tôi xóa thư mục .NET Fx, C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319tôi có thể thấy rằng các hội đồng bên thứ ba .NET Fx không được giải quyết:

Ứng dụng thuộc tính dự án NDepend và các nhóm bên thứ ba không được giải quyết

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc cho NDepend


1

Vui lòng tìm kiếm "phụ thuộc" trong google, đó là một tiện ích nhỏ để xử lý việc này.


7
Lưu ý rằng walker walker khá cũ và không hợp tác với 64 bit. Nó chắc chắn sẽ hiển thị tất cả các DLL phụ thuộc, đó là những gì OP đang tìm kiếm, nhưng nó cũng gây thêm tiếng ồn - bạn sẽ thấy bạn thực thi 32 bit thiếu một số dll 64 bit và cứ thế ... Đáng buồn thay, vẫn không có gì tốt hơn thay thế.
eran

@eran Còn bây giờ thì sao? Có một sự thay thế tốt hơn bây giờ? Cảm ơn.
Nikos

@ RestlessC0bra Không phải tôi biết, nhưng tôi đã không phát triển Windows trong 5 năm qua. Chắc chắn người đi bộ phụ thuộc đã chết, và thật xấu hổ khi Microsoft không bận tâm đến việc cập nhật công cụ hữu ích này cũng như không mở nguồn của nó để những người khác có thể giữ cho nó tồn tại.
eran

1
@eran Không DW không chết. Rõ ràng nó vẫn được sử dụng rộng rãi. Có một số công cụ khác, nhưng DW vẫn có thể là tốt nhất.
Nikos

@ RestlessC0bra: Phụ thuộc Walker đã chết. Nó không bao giờ bắt kịp với các mô-đun 64-bit. Nếu bạn nhìn kỹ, rất nhiều việc sử dụng Dependency Walker rộng rãi đó dẫn đến các câu hỏi về Stack Overflow, hỏi tại sao điều gì đó đang xảy ra. Điều đó không bao giờ xảy ra, mặc dù. Nó chỉ là một âm tính giả / tích cực. Giám sát quy trình nên là công cụ ưa thích của bạn.
IInspectable

1

Nếu bạn có mã nguồn, bạn có thể sử dụng ndepend.

http://www.ndepend.com/

Nó đắt tiền và làm được nhiều hơn so với việc phân tích các phụ thuộc để có thể quá mức cho những gì bạn đang tìm kiếm.


3
Là một công cụ được thiết kế riêng cho .NET, nó có phân tích sự phụ thuộc cho hình ảnh gốc không?
IInspectable

Có lẽ là không, @IInspectable. Tôi không nghĩ .NET có cách để làm điều đó, ngoại trừ có thể sử dụng P-Invoke.
kayleeFrye_onDeck

@kayleeFrye_onDeck: Phân tích bảng nhập dữ liệu để đọc các tệp. .NET có thể đọc tập tin.
IInspectable

Vâng! Tuy nhiên, không có API .NET để làm điều này :( Bạn có đề xuất gì? Tôi không thực sự là một lập trình viên .NET, chỉ là người sử dụng nó khi các giải pháp cấp thấp hơn không sử dụng được. Có rất nhiều công cụ kiểm tra ngoài kia, nhưng rất ít cho Windows thân thiện với phân phối, chứ đừng nói nhanh ... Tôi đang tìm cách sử dụng nó để kiểm tra một lượng nhị phân không xác định để phát hiện các khung được sử dụng khi biên dịch, vì vậy tôi có thể xử lý chúng bằng các thông số đặc biệt hoc. Tôi có thể phải xem xét sử dụng LoadLibraryEx...
kayleeFrye_onDeck

1
@kayleeFrye_onDeck: Không có gì trong API Windows để đọc các bảng nhập mô-đun. Bạn phải đọc các tập tin và phân tích nội dung. Không có sự khác biệt giữa mã gốc và .NET. LoadLibraryExkhông giúp được gì ở đó
IInspectable

0

Dự án pedeps ( https://github.com/brechtsanders/pedeps ) có một công cụ dòng lệnh (copypedeps) để sao chép (các) tệp .exe (hoặc của bạn) cùng với tất cả các tệp mà nó phụ thuộc. Nếu bạn làm điều đó trên hệ thống nơi ứng dụng hoạt động, bạn sẽ có thể gửi nó với tất cả các DLL phụ thuộc.


0

Vui lòng tham khảo bộ công cụ SysI Internalal từ Microsoft từ liên kết bên dưới, https://docs.microsoft.com/en-us/sysi

Xem thư mục tải xuống, mở "Procexp64.exe" làm đặc quyền quản trị viên. Mở Menu Tìm kiếm-> Tùy chọn "Tìm Xử lý hoặc DLL" hoặc phím tắt Ctrl + F.

nhập mô tả hình ảnh ở đây


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.