如何使用lldb + mono设置断点

时间:2014-02-21 17:41:09

标签: debugging mono lldb

我有以下要调试的C#程序(test.cs):

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine( "Hello, World!" );
        List<int> list = new List<int>();
        list.Add(123);
        list.Add(234);
        list.Add(345);
        list.Add(456);
        int number = 4;
        ++number;
        Console.WriteLine(" number " + number); // <--- L:16 I want to set a breakpoint here :)
        Console.WriteLine("Number of elements" + list.Count);
        foreach (Object obj in list)
        {
            Console.WriteLine(" " + obj);
        }
        Console.WriteLine("Bye");
    }
}

以下是使用 lldb mono (我在OSX中)的调试会话。我可以启动会话并运行程序但是我无法设置任何断点。我想当使用mono作为可执行文件时,事情是不同的。我怎样才能做到这一点?

$ mcs -debug test.cs
$ lldb 
(lldb) target create mono
Current executable set to 'mono' (i386).
(lldb) b test.cs:16
Breakpoint 1: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.
(lldb) run --debug test.exe 
Process 15191 launched: '/usr/bin/mono' (i386)
Hello, World!
 number 5
Number of elements4
 123
 234
 345
 456
Bye
Process 15191 exited with status = 0 (0x00000000) 
(lldb) 

我尝试使用GBD作为this old guide suggests,但更糟糕的是,显然有something broken in mono in OSX使得无法调试,除非使用软调试器(这正是我想要避免的)。 MonoDevelop调试器确实非常不稳定/不可靠/慢速)。这是what I have tried with GBD。一点也不运气。

非常感谢帮助。

1 个答案:

答案 0 :(得分:2)

不是mono您的语言翻译和test.exe二进制文件吗? lldb只知道mono - 您尝试设置的任何断点都在mono解释器中。例如如果您正在调试mono本身的问题。

这是一个足够独特的环境,您需要做一些分析才能理解lldb看到的内容。你得到什么

(lldb) image list test.exe

?当然,如果你这样做

(lldb) im li mono

你会看到列出的单声道 - 因为它是lldb知道的二进制文件。 (您可以使用普通image list又名im li来查看lldb知道的所有二进制文件。

您可以让lldb根据源文件名列出所有行表条目并使用命令行

(lldb) target modules dump line-table test.cs

如果lldb有test.cs的任何调试信息,您将看到一个行表。如果没有行表,文件和行断点(b test.cs:16)将无法正常工作。

对于它的价值,我不认为尝试使用lldb(或gdb)来调试你的C#程序是可行的。您可能需要使用单声道运行时本身的一些功能来设置断点并检查程序状态。