Как точно определить, какая строка кода меняет заданную переменную в C# с помощью отладчика Visual Studio 2017? - PullRequest
0 голосов
/ 05 марта 2020

У меня есть некоторое время (правда) l oop, и есть список, который я обновляю в конце каждого l oop, но я смог точно определить место, где список меняется в середине л oop. Тем не менее, я не написал ни одного кода, адреса которого в этой части кода бывают l oop 2D-массивы, называемые test1 и test2, отличаются, когда я запускаю код, хотя нигде (я проверил ctrl + F) внутри movePiece обращается к boardHistory.

Я хочу как-то отследить этот список, чтобы при его изменении я может видеть стек вызовов и строку, которая изменила его.

while (true)
            {
                prompt();
                if (!moveSet.empty())
                {
                    inStr = moveSet.next();
                }
                else
                {
                    inStr = Console.ReadLine().ToLower();
                }

                validInput = true;
                if (!inputIsValid(inStr))
                {
                    validInput = false;
                    Console.WriteLine("invalid input");
                }

                if (validInput)
                {
                    string[] arr = inStr.Split(' ');

                    int[,] test1 = boardHistory[boardHistory.Count - 1].boardValues;
                    movePieceTrad(arr[0], arr[1]);
                    int[,] test2 = boardHistory[boardHistory.Count - 1].boardValues;

                    if (!moveValid)
                    {
                        continue;
                    }
                    else
                    {
                        turn++;
                        posOrNegTurn = -posOrNegTurn;

                        int w = tradToCoords(arr[1])[0];
                        int u = tradToCoords(arr[1])[1];

                        bool tempPawnBool = false;
                        if (Math.Abs(board[w, u]) == 1)
                        {
                            tempPawnBool = true;
                        }

                        int[] movement = {
                            tradToCoords(arr[0])[0], tradToCoords(arr[0])[1],
                            tradToCoords(arr[1])[0], tradToCoords(arr[1])[1]
                        };

                        bool tempCaptureBool = false;
                        int[,] test4 = boardHistory[boardHistory.Count - 1].boardValues;
                        int test5 = boardHistory[boardHistory.Count - 1].boardValues[w, u];
                        if (boardHistory[boardHistory.Count - 1].boardValues[w, u] != 0) // if the last board state had a piece where the last move landed
                        {
                            tempCaptureBool = true;
                        }

                        if (moveWasEnPassant)
                        {
                            board[w, u - board[w, u]] = 0;
                            tempCaptureBool = true;
                        }

                        moveHistory.Add(new Move(
                            Math.Abs(board[w, u]),
                            board[w, u] / Math.Abs(board[w, u]),
                            tempCaptureBool,
                            tempPawnBool,
                            movement
                            ));

                        moveWasEnPassant = false;

                        if (!(board[w, u] == 1 && u - tradToCoords(arr[0])[1] == 2) &&
                            !(board[w, u] == -1 && u - tradToCoords(arr[0])[1] == -2))
                        {
                            resetEnPassant();
                        }

                        int temp = board[w, u]; //the value of the piece just moved
                        int type = temp / Math.Abs(temp);

                        if (Math.Abs(temp) == 6)
                        {
                            if (type == -1) castlePiecesMoved[0, 1] = 1;
                            if (type == 1) castlePiecesMoved[1, 1] = 1;
                        }
                        if (Math.Abs(temp) == 4)
                        {
                            if (type == -1 && w == 0) castlePiecesMoved[0, 0] = 1;
                            if (type == 1 && w == 0) castlePiecesMoved[1, 0] = 1;
                            if (type == -1 && w == 7) castlePiecesMoved[0, 2] = 1;
                            if (type == 1 && w == 7) castlePiecesMoved[1, 2] = 1;
                        }

                        if (!aMoveExistsForType(posOrNegTurn))
                        {
                            if (posOrNegTurn == -1 && blackIsChecked)
                            {
                                Console.WriteLine("--White wins by checkmate--");
                                printBoard();
                            }
                            else if (posOrNegTurn == 1 && whiteIsChecked)
                            {
                                Console.WriteLine("--Black wins by checkmate--");
                                printBoard();
                            }
                            else
                            {
                                Console.WriteLine("--Draw by stalemate--");
                                printBoard();
                            }
                            //BoardObject tempBoardObject2 = new BoardObject(board, possibleEnPassants, castlePiecesMoved, posOrNegTurn);
                            //boardHistory.Add(tempBoardObject2);
                            break;
                        }
                        BoardObject tempBoardObject = new BoardObject(board, possibleEnPassants, castlePiecesMoved, posOrNegTurn);
                        boardHistory.Add(tempBoardObject);
                    }
                }
                printBoard();
            }

1 Ответ

0 голосов
/ 09 марта 2020

Я хочу как-то отследить этот список, чтобы при его изменении я мог видеть стек вызовов и строку, которая его изменила.

Я думаю, вы можете установить точку останова в верхней части l oop с окном стека вызовов и окном наблюдения .

Когда вы его запускаете, сначала установите точку останова и затем выберите Начать отладку . В рамках этого процесса окно Call Stack покажет стек вызовов и увидит его строку c.

Кроме , когда вы продолжаете выполнение через точку останова, когда изменяется стек вызовов, курсор является затронутой линией.

Также , вы можно использовать Окно просмотра , чтобы увидеть изменения переменных, и по мере того, как точка останова прогрессирует, оно напрямую отражает тонкие изменения в ваших параметрах.

Надеюсь, это может помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...