Не удается связать точку останова с MDbg (всегда несвязанная и неэффективная)

Я не могу установить рабочие (не несвязанные) точки останова с помощью командной строки MDbg (.Net Managed Code Debugger) с модулями C#, скомпилированными с помощью csc в командной строке, а также под Windows 10. Я потратил целый день, пытаясь выяснить, как исправить это до абсолютно бесполезно. Вот подробные шаги, которые я предпринял, чтобы показать эту странную проблему.

Подробнее

Установлен MDbg с NuGet 4.4.1.4656:

nuget install MDbg -Version 0.1.0

И установите путь к xxx/NuGet/MDbg.0.1.0/tools. Затем скомпилируйте простой тестовый исходный код С# (пробовал с .Net frameworks 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>

Любая помощь, решение, предложение, идея, высоко ценится. Спасибо.


person Djee    schedule 07.12.2017    source источник
comment
Пользователи, создающие пакеты nuget, подобные этому, — не совсем хорошая идея. Имейте в виду, что mdbg — это образец, предназначенный для того, чтобы показать программистам, как создать собственный отладчик. Не предназначен для производственного использования, пользовательский интерфейс довольно минимален, и не ожидайте получить хорошие сообщения об ошибках. И моно примечательно, не так уверен, что Mono достаточно близко следует интерфейсу отладчика .NET, чтобы позволить работать mdbg. Аналогичный инструмент для Mono здесь.   -  person Hans Passant    schedule 08.12.2017
comment
Я согласен и благодарю вас за ваш ответ. Идея состоит в том, чтобы перенести некоторый код на Mono (и спасибо за указание на его отладчик), но в настоящее время я не использую Mono! Я использую .Net framework с csc! Вы также правы, говоря, что MDbg - это просто игрушка и пример. Но некоторым удалось хотя бы установить допустимую точку останова. Тем не менее, поскольку теперь я ориентируюсь на Native Windows с помощью csc в командной строке, мне бы хотелось иметь какую-нибудь базовую утилиту отладки. И насколько мне известно, единственным кандидатом в этом фреймворке является MDbg. Любые другие также приветствуются, но я не думаю, что они существуют.   -  person Djee    schedule 08.12.2017


Ответы (1)


Для меня проблема заключалась в том, что файл PDB был в новом «портативном» формате файла PDB, который был представлен с .Net Core, однако MDbg понимает только устаревший формат «Windows» или «Full» PDB, который изначально использовался с .Net Framework. , поэтому для того, чтобы он работал, используйте опцию при компиляции создавать полный вместо переносимого.

person yoel halb    schedule 10.05.2020