【问题标题】:How to set a breakpoint with lldb + mono如何使用 lldb + mono 设置断点
【发布时间】:2014-02-21 17:41:09
【问题描述】:

我有以下要调试的 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");
    }
}

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

$ 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。一点运气都没有。

感谢您的帮助。

【问题讨论】:

  • 这似乎会受到 Mono 的执行环境工作方式的严重影响。您的进程是否作为单声道内的 dylib 加载? mono 是否对 .net 字节码进行 JIT 编译?假设是前者,你的 test.exe 是否有 DWARF 格式的调试信息?
  • 我认为是后者。 JIT 是默认设置。当我做mcs -debug test.cs 时,除了 test.exe 还创建了 test.exe.mdb。这意味着在调试会话中使用。我想知道如何在 lldb 中使用这样的文件
  • 这取决于 MDB 格式是什么。如果它是专有的 Microsoft 格式,则 LLDB 不太可能有解码器。如果 OTOH,它是一种开源格式,有足够动力的人可以为它编写解码器。
  • 但这仍然不能给你完整的体验。例如,LLDB 不了解 C# 作为一种编写表达式的语言,所以你会发现自己在这方面受到严重限制。此外,LLDB 不理解 .net 类型 - 您必须将来自 MDB 调试信息的类型表示为 Clang 类型,就目前情况而言

标签: debugging mono lldb


【解决方案1】:

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

这是一个足够独特的环境,您需要进行一些分析以了解 lldb 看到的内容。你得到什么

(lldb) image list test.exe

?当然如果你这样做了

(lldb) im li mono

您会看到单声道列表——因为这是 lldb 知道的二进制文件。 (你可以使用普通的image list aka im li 来查看 lldb 知道的所有二进制文件)

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

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

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

不管怎样,我认为尝试使用 lldb(或 gdb)来调试 C# 程序是行不通的。您可能需要使用 mono 运行时本身的一些工具来设置断点并检查程序状态。

【讨论】:

  • 谢谢 Jason,我确实在调试 test.exe 但附加了单声道,所以我没有看到 im li test.exe 的任何内容,但我确实在 im li mono 中看到了单声道。所以似乎我正在尝试做一些不可能的事情,因为 llvm 对 test.exe 一无所知
  • 我忘了提到像 mcs -debug test.cs 这样编译也会生成文件 test.exe.mdb,根据文档,它可以用 gdb 调试,所以我认为它也可以用 lldb 调试。文档提到了将 resove memomy 地址转换为函数名称等的运行时函数。mono-project.com/Debugging#Debugging_with_GDB。我实际上可以在调试 c# 应用程序使用的 cpp 插件时从 Xcode 调用 mono_pmip。所以我仍然希望我可以使用 lldb 或在leadt gdb 代替 monodebbuger :)
  • 是的,他们使它与 gdb 一起工作的方式是定义一堆 gdb 命令,这些命令调用 mono 来执行地址到函数名称映射等。该网页上有一个部分用于使用 lldb 进行调试。我没有尝试他们在页面上的代码,但它看起来很合理。你试过吗?
  • 哦!!,上次我检查那个页面时,没有那个部分。那是新的:document.lastModified "02/26/2014 06:05:04" 。以后我会在家检查的! :-)
猜你喜欢
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 2017-02-12
  • 2018-05-13
  • 2014-07-06
  • 2023-04-05
  • 2019-12-18
相关资源
最近更新 更多