จะตรวจสอบ DLL พึ่งพาได้อย่างไร?


166

บางครั้งเมื่อฉันทำโครงการเล็ก ๆ ฉันไม่ระวังพอและบังเอิญเพิ่มการพึ่งพาสำหรับ DLL ที่ฉันไม่ทราบ เมื่อฉันจัดส่งโปรแกรมนี้ให้เพื่อนหรือคนอื่น ๆ "มันไม่ทำงาน" เพราะ "DLL บางตัว" หายไป นี่เป็นเพราะโปรแกรมสามารถค้นหา DLL บนระบบของฉัน แต่ไม่ใช่ในโปรแกรม

มีวิธีสแกนการปฏิบัติการเพื่ออ้างอิง DLL หรือรันโปรแกรมในสภาพแวดล้อมที่ปราศจาก DLL "สะอาด" สำหรับการทดสอบเพื่อป้องกันสถานการณ์oopsเหล่านี้หรือไม่


2
ดีบักเกอร์แสดง DLL ทุกตัวที่โหลดในหน้าต่างผลลัพธ์ โมดูล Debug + Windows + แสดงรายการของพวกเขา ตรวจสอบให้แน่ใจว่าคุณสามารถบัญชีทั้งหมดได้ และทดสอบการติดตั้งของคุณเช่นเดียวกับที่คุณทดสอบรหัสของคุณใช้ VM
Hans Passant

@Hans Passant: ฉันสามารถหารายชื่อเต็มของ DLL windows มาตรฐานที่ไหนสักแห่ง?
orlp

ใช่ใน c: \ windows \ system32 ด้วยลิขสิทธิ์ Microsoft
Hans Passant

2
@orlp - dumpbin /dependents <program>คุณอาจลอง ฉันคาดเดารายชื่อจะมีความเกี่ยวข้องมากกว่ารายการที่กำลังทั้งหมดในหรือ%SYSTEM% %SYSTEM32%ดูตัวเลือก DUMPBINใน MSDN ด้วย
jww

คำตอบ:


105

ลองDependency Walker(ปรับปรุงครั้งล่าสุดในปี 2006) Dependenciesหรือเขียนที่ทันสมัยของมันเรียกว่า


20
ฉันอ่านแล้วว่าวันนี้ลงวันที่ในปัจจุบันมีอะไรอีกไหม?
TankorSmash

6
ถ้าเป็นไปได้ฉันจะไว้วางใจเฉพาะผู้ให้บริการระบบปฏิบัติการดั้งเดิมเนื่องจากการพึ่งพา ddl ควรเป็นงานระบบปฏิบัติการ .. โปรแกรมอรรถประโยชน์ใด ๆ ของ Microsoft สามารถทำสิ่งนี้ได้หรือไม่? บรรทัดคำสั่งใช้ได้สำหรับฉัน
Robin Hsu

3
@RobinHsu: DependencyWalker ใช้ในการจัดส่งกับ Visual Studio จนถึง Visual Studio 2005 บิลด์ล่าสุดประกอบด้วยชุดพัฒนาไดรเวอร์ Windows (และไม่สามารถใช้ได้ผ่านเว็บไซต์ทางการ) ยังไม่ได้เป็นเครื่องมือของ Microsoft อย่างเป็นทางการ แต่ถูกคว่ำบาตรส่งเสริมและโฆษณาโดย Microsoft
IInspectable

8
dumpbinมากกว่าวอล์คเกอร์พึ่งพา msdn.microsoft.com/en-us/library/756as972.aspx | stackoverflow.com/a/28304716/3543437
kayleeFrye_onDeck

8
ขณะนี้เป็นเขียนมาเปิดทำบางส่วนใน C #, พบ " Dependencies.exe ": github.com/lucasg/Dependencies ทดสอบการแสดงผล: bit-ishเล็กน้อย แต่มันจัดการกับชุด APIและSxS (หายไปจาก Dependency Walker)
Stein Åsmul

218

dumpbin จากเครื่องมือ Visual Studio (โฟลเดอร์ VC \ bin) สามารถช่วยได้ที่นี่:

dumpbin /dependents your_dll_file.dll

7
เครื่องมือเล็ก ๆ น้อย ๆ ที่มีประโยชน์และประหยัดไม่ต้องติดตั้งอะไรใหม่เมื่อคุณติดตั้ง VS แล้ว
James

13
ใช่dumpbin.exeเป็นประโยชน์อย่างมากที่จะคิดออกและ/dependents /importsคุณสามารถใช้บนเครื่องอื่น ๆ ได้หากคุณคัดลอกlink.exeไปพร้อมกับมันและตรวจสอบให้แน่ใจว่าx86 Visual C ++ Runtime Redistributable ( msvcr120.dllสำหรับ Visual Studio 2013)นั้นพร้อมใช้งานบนเครื่องเป้าหมาย ตัวเลือกบางอย่างมีการอ้างอิงเพิ่มเติม - โดยวิธีการที่พวกเขาเมาขึ้นชื่อตัวเลือกมันควรจะได้รับ/PREREQUISITESมากกว่าที่/DEPENDENTSพวกเขาควรจะศึกษาภาษาละติน
Lumi

2
มันยอดเยี่ยมมากเราได้เพิ่มสิ่งนี้ลงในระบบการสร้างของเราเป็นขั้นตอนการตรวจสอบเมื่อมีการสร้างปฏิบัติการขั้นสุดท้ายดังนั้นเราจึงไม่พึ่งพาสิ่งที่ไม่รวมอยู่ในการจัดส่ง
Lothar

4
ข้อเสียเปรียบเพียงอย่างเดียวคือเครื่องมือที่มีประโยชน์นี้ถูกซ่อนอยู่อย่างมาก: c: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach

1
@rkachach หากคุณเปิดบรรทัดคำสั่ง Visual Studio (เครื่องมือ -> พรอมต์คำสั่งของ Visual Studio) สิ่งนี้จะได้รับการยอมรับว่าเป็นคำสั่งภายนอกและคุณเพียงแค่พิมพ์ "dumpbin"
Bemipefe

46

ฉันสามารถแนะนำวิธีแก้ปัญหาที่น่าสนใจสำหรับแฟน ๆ Linux หลังจากที่ฉันสำรวจโซลูชันนี้ฉันได้เปลี่ยนจาก DependencyWalker เป็นโซลูชันนี้

คุณสามารถใช้ชื่นชอบของคุณlddมากกว่าที่ใช้ Windows ที่เกี่ยวข้อง,exedll

การทำเช่นนี้คุณต้องติดตั้งCygwin (การติดตั้งขั้นพื้นฐานโดยไม่ต้องแพคเกจเพิ่มเติมที่จำเป็น) บน Windows Cygwin Terminalของคุณและจากนั้นเพียงแค่เริ่มต้น ตอนนี้คุณสามารถรันคำสั่ง Linux ที่คุณโปรดปรานได้รวมไปถึง:

$ ldd your_dll_file.dll

UPD:คุณสามารถใช้lddยังผ่านสถานีทุบตีคอมไพล์บน Windows ไม่จำเป็นต้องติดตั้ง cygwin ในกรณีที่คุณติดตั้ง git เรียบร้อยแล้ว


ฉันเพิ่งติดตั้ง cygwin และยินดีที่จะหาคำสั่ง linux กลับมา แต่ฉันไม่สามารถออกจากรูท Cygwin เพื่อเข้าถึงไฟล์อื่น ๆ ในไดรฟ์ภายในเครื่องของฉัน (C :) เป็นเรื่องปกติหรือไม่
ThomasGuenet

1
ฉันคิดว่านี่จะช่วยคุณได้: stackoverflow.com/questions/1850920/…
troyane

4
$ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000)แต่น่าเสียดายที่มีการอ้างอิงบางอย่างที่ไม่พบวิธีนี้: dumpbin ยูทิลิตี้แสดงการอ้างอิงทั้งหมดอย่างถูกต้อง
fgiraldeau

5
ฉันใช้ ldd ผ่านเทอร์มินัล GIT BASH บน windows และทำงานได้ดี ดังนั้นหากคุณมีคอมไพล์มันจะง่ายไม่จำเป็นต้องติดตั้ง cygwin ตัวอย่าง: 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_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) ระบบ KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov

1
ในฐานะที่เป็นคนที่ติดตั้ง git ทุบตีมาแล้วนี่เป็นทางออกที่ดีกว่า ขอบคุณ!
Nicolas

28
  1. กำหนดพา ธ ไฟล์แบบเต็มไปยังชุดประกอบที่คุณพยายามใช้งาน

  2. กดปุ่มเริ่มพิมพ์ "dev" เปิดโปรแกรมที่ชื่อว่า "Developer Command Prompt for VS 2017"

  3. ในหน้าต่างที่เปิดขึ้นให้พิมพ์dumpbin /dependents [path]ตำแหน่ง[path]ของเส้นทางที่คุณคิดในขั้นตอนที่ 1

  4. กดปุ่ม Enter

แบมคุณมีข้อมูลการพึ่งพาของคุณ หน้าต่างควรมีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

อัปเดตสำหรับ VS 2019:คุณต้องมีแพ็คเกจนี้ในการติดตั้ง VS ของคุณ:ป้อนคำอธิบายรูปภาพที่นี่


9
  1. มีโปรแกรมที่เรียกว่า "ขึ้นอยู่กับ"
  2. หากคุณมี cygwin ติดตั้งแล้วไม่มีอะไรง่ายกว่าแล้ว ldd file.exe

4
เครื่องมือที่เรียกว่าการอ้างอิง Walker ; ก็ภาพที่ปฏิบัติการได้รับการตั้งชื่อdepends.exe
IInspectable

7
Walker ขึ้นอยู่กับวันที่ มันสร้างขึ้นครั้งสุดท้ายในปี 2008!
SuB

dependsไม่รองรับชุด API ดังนั้นจึงไม่มีประโยชน์สำหรับ Win7 +
ivan_pozdeev

8

สิ่งที่ปลอดภัยที่สุดคือมีเครื่องเสมือนที่สะอาดซึ่งคุณสามารถทดสอบโปรแกรมของคุณได้ ในทุกเวอร์ชันที่คุณต้องการทดสอบให้เรียกคืน VM เป็นค่าเริ่มต้นใหม่ จากนั้นติดตั้งโปรแกรมของคุณโดยใช้การตั้งค่าและดูว่าใช้งานได้หรือไม่

ปัญหา dll มีใบหน้าที่แตกต่าง ถ้าคุณใช้ Visual Studio และเชื่อมโยงไปยัง CRT แบบไดนามิกคุณต้องกระจาย CRT DLLs อัปเดต VS ของคุณและคุณต้องเผยแพร่ CRT รุ่นอื่น เพียงแค่ตรวจสอบการพึ่งพาไม่เพียงพอเนื่องจากคุณอาจพลาด การติดตั้งแบบเต็มบนเครื่องที่สะอาดเป็นวิธีเดียวที่ปลอดภัย IMO

หากคุณไม่ต้องการตั้งค่าสภาพแวดล้อมการทดสอบแบบเต็มเป่าและมี Windows 7 คุณสามารถใช้ XP-Mode เป็นเครื่องทำความสะอาดเริ่มต้นและXP-Moreเพื่อทำซ้ำ VM


6

บนเครื่องการพัฒนาของคุณคุณสามารถรันโปรแกรมและเรียกSysinternals Process Explorer ในบานหน้าต่างด้านล่างมันจะแสดง DLLs ที่โหลดและพา ธ ปัจจุบันไปให้พวกเขาซึ่งมีประโยชน์หลายประการ หากคุณกำลังใช้งานแพคเกจการปรับใช้ของคุณมันจะเปิดเผยว่า DLLs ใดที่อ้างถึงในเส้นทางที่ไม่ถูกต้อง (เช่นไม่ได้บรรจุอย่างถูกต้อง)

ในปัจจุบัน บริษัท ของเราใช้โครงการ Visual Studio Installer เพื่อเดินทรีพึ่งพาและเอาท์พุทเป็นไฟล์หลวมในโปรแกรม ใน VS2013 นี้อยู่ในขณะนี้เป็นส่วนขยาย: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d จากนั้นเราจะจัดทำไฟล์หลวมเหล่านี้ในตัวติดตั้งที่ครอบคลุมมากขึ้น แต่อย่างน้อยที่สุดก็ให้การติดตั้งโปรเจ็กต์ dot dot dependencies ทั้งหมดและวางลงในจุดเดียวและเตือนคุณเมื่อสิ่งที่ขาดหายไป


2

ในอดีต (เช่น WinXP วัน) ฉันเคยพึ่ง / พึ่งพา DLL Walker Dependency (depend.exe) แต่มีบางครั้งที่ฉันยังไม่สามารถระบุปัญหา DLL ได้ ตามหลักแล้วเราต้องการค้นหาก่อนรันไทม์โดยการตรวจสอบ แต่หากไม่สามารถแก้ไขได้ (หรือใช้เวลามากเกินไป) คุณสามารถลองเปิดใช้งาน "loader snap" ตามที่อธิบายไว้ในhttp://blogs.msdn.com/ b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspxและhttps://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspxและLoadLibrary ที่กล่าวถึงสั้น ๆล้มเหลว GetLastError ไม่ช่วย

คำเตือน: ฉันทำผิดพลาด Windows ของฉันในอดีตที่ผ่านมาหลอกด้วย gflag ทำให้คลานไปที่หัวเข่าของคุณคุณได้รับการเตือนล่วงหน้า

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: "Loader snap" เป็นแบบต่อกระบวนการดังนั้น UI ที่เปิดใช้งานจะไม่ถูกตรวจสอบอยู่ (ใช้ cdb หรือ glfags -i)


2

NDepend ได้ถูกกล่าวถึงแล้วโดย Jesse (ถ้าคุณวิเคราะห์รหัส. NET) แต่ให้อธิบายได้อย่างชัดเจนว่าจะช่วยได้อย่างไร

มีโปรแกรม / สคริปต์ที่สามารถสแกนการเรียกใช้งานสำหรับการอ้างอิง DLL หรือรันโปรแกรมในสภาพแวดล้อมที่ปลอด DLL เพื่อ "ทำความสะอาด" เพื่อทดสอบเพื่อป้องกันสถานการณ์เหล่านี้

ในแผง NDepend คุณสมบัติของโครงการคุณสามารถกำหนดสิ่งที่มีการประกอบการประยุกต์ใช้ในการวิเคราะห์ (สีเขียว) และNDepend จะอนุมานประกอบของบุคคลที่สามที่ใช้โดยคนที่แอพลิเคชัน (สีฟ้า) รายการไดเรกทอรีที่จะค้นหาแอปพลิเคชันและแอสเซมบลีของบุคคลที่สามมีให้

การประยุกต์ใช้คุณสมบัติของโครงการ NDepend และชุดประกอบของบุคคลที่สาม

หากไม่พบชุดประกอบของบุคคลที่สามในไดเรกทอรีเหล่านี้จะอยู่ในโหมดข้อผิดพลาด ตัวอย่างเช่นถ้าฉันลบไดเรกทอรี. NET Fx C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319ฉันจะเห็นว่า. NET Fx แอสเซมบลีของบุคคลที่สามไม่ได้รับการแก้ไข:

แอพพลิเคชั่นคุณสมบัติของโครงการที่อ้างอิง ND ND

ข้อจำกัดความรับผิดชอบ: ฉันทำงานเพื่อ NDepend


1

โปรดค้นหา "depend.exe" ใน google มันเป็นยูทิลิตี้ขนาดเล็กที่ใช้จัดการสิ่งนี้


7
โปรดทราบว่าวอล์คเกอร์อ้างอิงนั้นค่อนข้างล้าสมัยและไม่ทำงานร่วมกับ 64 บิตได้ดี มันจะแสดง DLLs ที่ขึ้นต่อกันทั้งหมดซึ่งเป็นสิ่งที่ OP กำลังมองหา แต่มันยังเพิ่มเสียงรบกวน - คุณจะพบว่าคุณปฏิบัติการได้ 32 บิตที่หายไป 64 บิตที่กำลัง DLLs เป็นต้น ... น่าเสียดายที่ยังไม่มีอะไรดีกว่า ทางเลือก
eran

@eran แล้วตอนนี้ล่ะ? ตอนนี้มีทางเลือกที่ดีกว่าไหม? ขอบคุณ
Nikos

@ RestlessC0bra ไม่ใช่ที่ฉันรู้ แต่ฉันไม่ได้ทำการพัฒนา Windows มาตลอด 5 ปีที่ผ่านมา วอล์คเกอร์ที่พึ่งพานั้นตายแล้วอย่างแน่นอนและเป็นความอัปยศที่ Microsoft ไม่ใส่ใจที่จะอัปเดตเครื่องมือที่มีประโยชน์นี้หรือเปิดแหล่งที่มาเพื่อให้ผู้อื่นสามารถทำให้มันมีชีวิตอยู่ได้
eran

1
@eran ไม่มี DW ไม่ตาย เห็นได้ชัดว่ามันยังคงใช้อย่างกว้างขวาง มีเครื่องมืออื่น ๆ อยู่บ้าง แต่ DW ก็น่าจะดีที่สุด
Nikos

@ RestlessC0bra: Walker พึ่งตาย มันไม่ติดกับโมดูล 64 บิต หากคุณดูอย่างใกล้ชิดเพียงพอการใช้ Dependency Walker จำนวนมากนั้นนำไปสู่คำถาม Stack Overflow โดยถามว่าเหตุใดจึงเกิดอะไรขึ้น แม้ว่าจะมีบางสิ่งที่ไม่เคยเกิดขึ้น มันเป็นแค่ลบ / บวกที่ผิด ๆ การตรวจสอบกระบวนการควรเป็นเครื่องมือที่คุณต้องการ
IIsspectable

1

หากคุณมีซอร์สโค้ดคุณสามารถใช้การอ้างอิงได้

http://www.ndepend.com/

มันมีราคาแพงและทำมากกว่าการวิเคราะห์การพึ่งพาดังนั้นมันอาจเกินความเป็นจริงสำหรับสิ่งที่คุณกำลังมองหา


3
การเป็นเครื่องมือที่ออกแบบมาเฉพาะสำหรับ. NET มันวิเคราะห์การพึ่งพาของรูปภาพในตัวด้วยหรือไม่?
IInspectable

อาจไม่ @Ispectable ฉันไม่คิดว่า. NET มีวิธีการทำเช่นนั้นยกเว้นอาจใช้สิ่ง P-Invoke
kayleeFrye_onDeck

@kayleeFrye_onDeck: การแยกวิเคราะห์ตารางนำเข้าจะทำให้ไฟล์อ่านลงไป .NET สามารถอ่านไฟล์ได้
IIsspectable

อ้อ! และยังไม่มี. NET API ให้ทำสิ่งนี้ :( คุณแนะนำอะไรจริง ๆ แล้วฉันไม่ใช่โปรแกรมเมอร์. NET เพียงคนที่ใช้งานเมื่อโซลูชันระดับล่างไม่ได้เลื่อนออกไป ออกไป แต่มีน้อยมากสำหรับ Windows ที่เป็นมิตรกับการแจกจ่ายให้อย่างรวดเร็วเพียงอย่างเดียว ... ฉันต้องการใช้มันเพื่อตรวจสอบไบนารีที่ไม่ทราบจำนวนซ้ำเพื่อตรวจสอบเฟรมเวิร์กที่ใช้เมื่อรวบรวมดังนั้นฉันจึงสามารถรักษามันด้วย hoc. ฉันอาจต้องตรวจสอบการใช้LoadLibraryEx...
kayleeFrye_onDeck

1
@kayleeFrye_onDeck: ไม่มีสิ่งใดใน Windows API ที่จะอ่านการนำเข้าตารางของโมดูล คุณต้องอ่านไฟล์และแยกเนื้อหา ไม่มีความแตกต่างระหว่างรหัสเนทีฟกับ. NET LoadLibraryExไม่ได้ช่วย
IIsspectable

0

โครงการ pedeps ( https://github.com/brechtsanders/pedeps ) มีเครื่องมือบรรทัดคำสั่ง (copypedeps) สำหรับการคัดลอกไฟล์. exe (หรือ. dll) พร้อมกับไฟล์ทั้งหมดที่ขึ้นอยู่กับ หากคุณทำเช่นนั้นในระบบที่แอปพลิเคชั่นทำงานคุณควรจะสามารถจัดส่งได้ด้วย DLLs ที่พึ่งพาทั้งหมด


0

โปรดอ้างอิงชุดเครื่องมือ SysInternal จาก Microsoft จากลิงค์ด้านล่าง https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer

ไปที่โฟลเดอร์ดาวน์โหลดเปิด "Procexp64.exe" เป็นสิทธิ์ของผู้ดูแลระบบ เปิดตัวเลือกค้นหาเมนู -> "ค้นหาที่จับหรือ DLL" หรือทางลัด Ctrl + F

ป้อนคำอธิบายรูปภาพที่นี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.