Công cụ Microsoft gflags sẽ luôn cho bạn biết chính xác phụ thuộc nào không tải được và tại sao.
Chạy gflags -i your_application.exe +sls
. Sau đó thực thi ứng dụng dưới trình gỡ rối để chụp loader traces.
gflags là một phần của Debugging Tools - bạn có thể đăng ký C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
để xem bạn đã có nó chưa. Bạn có thể thêm thư mục đó vào đường dẫn của bạn, hoặc chỉ thực thi gflags từ thư mục đó trong cmd.exe.
Ví dụ: sau khi chạy gflags, hãy đặt một điểm ngắt trên cuộc gọi ::LoadLibrary(_T("foo"))
và bước qua nó trong khi tìm kiếm lỗi trình tải trong cửa sổ đầu ra Visual Studio của bạn, ví dụ:
4b00:396c @ 479194074 - LdrpSnapThunk - ERROR: Procedure "[email protected][email protected]@[email protected]" could not be located in DLL "bar.dll"
First-chance exception at 0x0000000077307EF8 (ntdll.dll) in your_application.exe: 0xC0000139: Entry Point Not Found.
4b00:396c @ 479194074 - LdrpGenericExceptionFilter - ERROR: Function LdrpSnapIAT raised exception 0xc0000139
Exception record: .exr 0000000000129070
Context record: .cxr 0000000000128B80
4b00:396c @ 479194074 - LdrpHandleOneOldFormatImportDescriptor - ERROR: Snapping the imports from DLL "C:\test\64Debug\foo.DLL" to DLL "C:\test\64Debug\bar.dll" failed with status 0xc0000139
Điều này có nghĩa rằng trong thời gian tải của foo.dll
, phụ thuộc bar.dll
được nhập khẩu và nhập khẩu bar.dll
thất bại.
Nhập phụ thuộc không thành công do quy trình [email protected][email protected]@[email protected]
bị thiếu - bạn có thể demangle rằng đến public: void __cdecl vis_DollarMap::SetObject(int,void * __ptr64) __ptr64
.
Bạn có thể có phiên bản sai của phụ thuộc - có thể bạn cần phải xây dựng lại phụ thuộc để cập nhật.
Chạy gflags -i your_application.exe -sls
sau đó để tắt dấu vết bộ tải.
Có thể không có 'DllMain' trong thư viện? Nếu nó thất bại ':: LoadLibrary'? –
Nếu 'DllMain' đặt 'lỗi cuối cùng' là 127 và sau đó trả về' FALSE', thì 'lỗi cuối cùng' sẽ được ghi đè bởi hệ thống trước khi trở về từ ':: LoadLibrary'? –