2012-11-21 12 views
8

Tôi đang sử dụng XBuild để biên dịch các giải pháp Visual Studio cho Mono. Điều này tạo ra tập tin assembly + mdb. Có một khả năng để gỡ lỗi lắp ráp này với Visual Studio trên Windows? Khi sử dụng "Đính kèm với quá trình" tôi không thể gỡ lỗi vì một lỗi được hiển thị rằng các biểu tượng không được tải.Có thể gỡ lỗi các assembly được biên dịch với Mono/XBuild bằng Visual Studio trên Windows không?

Tôi đã thử tạo tệp pdb cho assembly này thông qua Mono.Cecil (AssemblyDefinition, MdbReaderProvider, PdbWriterProvider) và tải nó bằng tay qua Debug/Windows/Modules và "Load Symbol From/Symbol Path", thực sự tải các biểu tượng (được hiển thị trong cửa sổ Mô-đun) nhưng điều đó cũng không cho phép gỡ lỗi.

+1

Tôi không tin điều này là có thể (nhưng tôi rất muốn được chứng minh là sai). –

+1

Khi tôi tạo định dạng tệp '.mdb' của Mono nhiều năm trước, PDB không có giấy tờ và độc quyền, vì vậy chúng tôi không thể chỉ đơn giản sử dụng nó. Và AFAIK, điều này vẫn đúng ngày hôm nay (ít nhất Wikipedia nói như vậy). Có thể có một số công cụ ngoài đó để viết các tệp này, nhưng chúng không thể tạo các PDB "đúng" trừ khi chúng được Microsoft viết hoặc xuất bản định dạng tệp. Tuy nhiên, tôi cũng muốn được chứng minh là sai về điều này. –

+0

FYI nếu bạn đang làm điều ngược lại, sử dụng 'pdb2mdb some.dll' để chuyển đổi pdb sang định dạng mono – KCD

Trả lời

6

Khi so sánh các định nghĩa lắp ráp giữa các bản dựng VS2012 và các bản dựng XBuild, tôi nhận thấy rằng XBuild không tạo ra DebuggableAttribute. Nếu thuộc tính này bị thiếu, gỡ lỗi với Visual Studio 2012 là không thể, ngay cả khi bạn tải các biểu tượng theo cách thủ công. bước sau đây là cần thiết để lắp ráp debug được biên soạn với Mono/XBuild với VS2012:

  1. Sử dụng XBuild để biên dịch các giải pháp
  2. Sử dụng Mono.Cecil cho mỗi assembly bạn muốn gỡ lỗi để tạo ra các tập tin pdb và để tiêm DebuggableAttribute (xem mã bên dưới)
  3. Bắt đầu của bạn với XBuild biên soạn chương trình
  4. Sử dụng "debug/Đính kèm để xử lý ..." từ VS2012 để gỡ lỗi chương trình chạy

mã cho generatin g pdb và injecting DebuggableAttribute:

string assemblyPath = @"HelloWorld.exe"; 

var assemblyDefinition = AssemblyDefinition.ReadAssembly(assemblyPath, 
    new ReaderParameters() { SymbolReaderProvider = new MdbReaderProvider(), ReadSymbols = true}); 

CustomAttribute debuggableAttribute = newCustomAttribute(
assemblyDefinition.MainModule.Import(
    typeof(DebuggableAttribute).GetConstructor(new[] { typeof(bool), typeof(bool) }))); 

debuggableAttribute.ConstructorArguments.Add(new CustomAttributeArgument(
    assemblyDefinition.MainModule.Import(typeof(bool)), true)); 

debuggableAttribute.ConstructorArguments.Add(new CustomAttributeArgument(
    assemblyDefinition.MainModule.Import(typeof(bool)), true)); 

assemblyDefinition.CustomAttributes.Add(debuggableAttribute); 

assemblyDefinition.Write(assemblyPath, 
    new WriterParameters() { SymbolWriterProvider = new PdbWriterProvider(), WriteSymbols = true}); 
4

Điều này có thể thực hiện được với một chút nỗ lực một lần.

Bạn cần chuyển đổi các tệp mono mdb thành pdb tệp. Sau đó VS sẽ có thể bước qua mã với bạn (nếu bạn có các nguồn quá) - xem dưới đây.

http://johnhmarks.wordpress.com/2011/01/19/getting-mono-cecil-to-rewrite-pdb-files-to-enable-debugging/

Mono.Cecil không thay đổi khá thường xuyên, do đó bạn có thể tìm thấy các API đã thay đổi một chút cho việc này.

+0

Tôi cũng tìm thấy bài đăng này trước khi yêu cầu và thử nó (xem phần thứ hai của câu hỏi - qua AssemblyDefinition, MdbReaderProvider, PdbWriterProvider), có lẽ tôi đã làm một cái gì đó sai - nhưng VS không tải các biểu tượng tự động và khi tôi tải chúng bằng tay thông qua Debug/Windows/Modules và "Load Symbol From/Symbol Path" không có gì thay đổi. Tôi sẽ đăng đoạn mã của tôi khi tôi đang ở nhà. – Dresel

+0

Bạn cũng phải thêm một DebuggableAttribute, xem câu trả lời của tôi dưới đây. – Dresel