【问题标题】:Cannot bind breakpoint with MDbg (always unbound and ineffective)无法使用 MDbg 绑定断点(始终未绑定且无效)
【发布时间】:2017-12-07 22:27:02
【问题描述】:

我无法使用 命令行 MDbg (. Net 托管代码调试器)以及在 Windows 10 下以及在 命令行 上使用 csc 编译的 C# 模块。 我花了一整天的时间试图弄清楚如何解决这个问题,但完全无济于事。以下是我为显示这个奇怪的问题而采取的详细步骤。

详情

使用 NuGet 4.4.1.4656 安装 MDbg:

nuget install MDbg -Version 0.1.0

并将路径设置为 xxx/NuGet/MDbg.0.1.0/tools 然后编译一个简单的测试 C# 源代码(使用 .Net 框架 3.5 和 4.7 尝试过同样的问题):

csc /debug+ /optimize- test0.cs

test0.cs的内容:

using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
           int max;
           try   {max=int.Parse(args[0]);}
           catch {max=222;}
           List<int> primes = CollectPrimesUpTo(max);
           Console.WriteLine(String.Join(", ", primes.ConvertAll(i => i.ToString()).ToArray()));
        }
        static List<int> CollectPrimesUpTo(int max)
        {
            List<int> result = new List<int>();
            for(int i=1; i<=max; i++) {
             int j, sq = (int)Math.Sqrt((double)i);
             for(j=2; j<=sq; j++) {
              if(i % j == 0)
               break;
             }
             if(j>sq)
              result.Add(i);
            }  
           return result;
        }
    }
}

下面是一个调试会话,在 test0.cs|.exe|.pdb 所在的同一文件夹下启动,设置断点的尝试不同(无论如何尝试了更多):所有未绑定且不工作,因为 go 命令将程序运行到最后。 [还有一些奇怪的事情是设置 path 需要 show 命令才能工作。否则你会收到这条荒谬的消息:“错误:源文件 'b:_limbo\GUIonCSharpMono-master\test0.cs' 不可用。”]

D:\_limbo\GUIonCSharpMono-master>Mdbg test0 23
MDbg (Managed debugger) v0.0.0.0 started.
Copyright (C) Microsoft Corporation. All rights reserved.
For information about commands type "help";
to exit program type "quit".
run test0 23
STOP: Breakpoint Hit
located at line 9 in test0.cs
[p#:0, t#:0] mdbg> path D:\_limbo\GUIonCSharpMono-master
Path set to: D:\_limbo\GUIonCSharpMono-master
6      class Program
7      {
8          static void Main(string[] args)
9:*        {
10             int max;
11             try   {max=int.Parse(args[0]);}
[p#:0, t#:0] mdbg> x test0
~0. ConsoleApplication1.Program.Main(args)
~1. ConsoleApplication1.Program.CollectPrimesUpTo(max)
~2. ConsoleApplication1.Program..ctor()
~3. ConsoleApplication1.Program.<Main>b__0(i)
[p#:0, t#:0] mdbg> break ~1
Breakpoint #1 unbound (:1!ConsoleApplication1.Program::CollectPrimesUpTo(+0))
[p#:0, t#:0] mdbg> break CollectPrimesUpTo
Breakpoint #2 unbound (::CollectPrimesUpTo(+0))
[p#:0, t#:0] mdbg> break ConsoleApplication1.Program.CollectPrimesUpTo
Breakpoint #3 unbound (ConsoleApplication1.Program::CollectPrimesUpTo(+0))
[p#:0, t#:0] mdbg> break test0.cs:25
Breakpoint #4 unbound (line 25 in test0.cs)
[p#:0, t#:0] mdbg> break
Current breakpoints:
Breakpoint #1 unbound (:1!ConsoleApplication1.Program::CollectPrimesUpTo(+0))
Breakpoint #2 unbound (::CollectPrimesUpTo(+0))
Breakpoint #3 unbound (ConsoleApplication1.Program::CollectPrimesUpTo(+0))
Breakpoint #4 unbound (line 25 in test0.cs)
[p#:0, t#:0] mdbg> go
1, 2, 3, 5, 7, 11, 13, 17, 19, 23
STOP: Process Exited
mdbg> exit
D:\_limbo\GUIonCSharpMono-master>

任何帮助、解决方案、建议、想法,都非常感谢。谢谢。

【问题讨论】:

  • 用户创建这样的 nuget 包并不是一个好主意。请记住,mdbg 是一个示例,它旨在向程序员展示如何创建自己的调试器。不适合生产使用,用户界面非常小,不要期望得到好的错误消息。并且“mono”是值得注意的,不确定 Mono 是否足够紧密地遵循 .NET 调试器接口以允许 mdbg 工作。为 Mono is here 制作的类似工具。
  • 我同意并感谢您的回复。这个想法是在 Mono 上移植一些代码(并感谢您提供指向其调试器的指针),但目前我不使用 Mono!我使用带有 csc 的 .Net 框架!你说 MDbg 只是一个玩具和一个例子也是对的。但是有些人成功地至少设置了一个有效的断点。尽管如此,由于我现在在命令行上使用 csc 来定位 Native Windows,我想要一些基本的调试实用程序。据我所知,这个框架中唯一的候选者是 MDbg。任何其他的也会受到欢迎,但我认为不存在。

标签: c# .net csc mdbg


【解决方案1】:

对我来说,问题是 PDB 文件采用 .Net Core 引入的新“便携式”PDB 文件格式,但是 MDbg 只理解最初使用的旧版“Windows”或“完整”PDB 格式.Net Framework,所以为了让它工作,在编译时使用该选项来创建完整的而不是可移植的。

【讨论】:

    猜你喜欢
    • 2015-10-22
    • 2021-11-02
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2020-12-06
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多