paulo-fernando-silva / vscOctaveDebugger

MIT License
35 stars 4 forks source link

Debugger gets stuck at `pause` statements #23

Closed Nikita240 closed 5 years ago

Nikita240 commented 5 years ago

Ok I know the pause command causes issues with the debugger, but the readme states that the debugger will just skip over pause statements.

This doesn't seem to be happening to me with v0.3.14. The debugger get's stuck at the pause statement and doesn't even produce any output (even though there is a printf() right before the first pause).

For context, I'm trying to debug ex1.m from Andrew Ng's ML class.

paulo-fernando-silva commented 5 years ago

Hi Nikita, thanks for reaching out. I wasn't able to reproduce that issue, I don't have that ex1.m I believe. Can you share some source? Thanks

Nikita240 commented 5 years ago

Absolutely! Here is the file.

%% Machine Learning Online Class - Exercise 1: Linear Regression

%  Instructions
%  ------------
%
%  This file contains code that helps you get started on the
%  linear exercise. You will need to complete the following functions
%  in this exericse:
%
%     warmUpExercise.m
%     plotData.m
%     gradientDescent.m
%     computeCost.m
%     gradientDescentMulti.m
%     computeCostMulti.m
%     featureNormalize.m
%     normalEqn.m
%
%  For this exercise, you will not need to change any code in this file,
%  or any other files other than those mentioned above.
%
% x refers to the population size in 10,000s
% y refers to the profit in $10,000s
%

%% Initialization
clear ; close all; clc

%% ==================== Part 1: Basic Function ====================
% Complete warmUpExercise.m
fprintf('Running warmUpExercise ... \n');
fprintf('5x5 Identity Matrix: \n');
warmUpExercise()

fprintf('Program paused. Press enter to continue.\n');
pause;

%% ======================= Part 2: Plotting =======================
fprintf('Plotting Data ...\n')
data = load('ex1data1.txt');
X = data(:, 1); y = data(:, 2);
m = length(y); % number of training examples

% Plot Data
% Note: You have to complete the code in plotData.m
plotData(X, y);

fprintf('Program paused. Press enter to continue.\n');
pause;

%% =================== Part 3: Cost and Gradient descent ===================

X = [ones(m, 1), data(:,1)]; % Add a column of ones to x
theta = zeros(2, 1); % initialize fitting parameters

% Some gradient descent settings
iterations = 1500;
alpha = 0.01;

fprintf('\nTesting the cost function ...\n')
% compute and display initial cost
J = computeCost(X, y, theta);
fprintf('With theta = [0 ; 0]\nCost computed = %f\n', J);
fprintf('Expected cost value (approx) 32.07\n');

% further testing of the cost function
J = computeCost(X, y, [-1 ; 2]);
fprintf('\nWith theta = [-1 ; 2]\nCost computed = %f\n', J);
fprintf('Expected cost value (approx) 54.24\n');

fprintf('Program paused. Press enter to continue.\n');
pause;

fprintf('\nRunning Gradient Descent ...\n')
% run gradient descent
theta = gradientDescent(X, y, theta, alpha, iterations);

% print theta to screen
fprintf('Theta found by gradient descent:\n');
fprintf('%f\n', theta);
fprintf('Expected theta values (approx)\n');
fprintf(' -3.6303\n  1.1664\n\n');

% Plot the linear fit
hold on; % keep previous plot visible
plot(X(:,2), X*theta, '-')
legend('Training data', 'Linear regression')
hold off % don't overlay any more plots on this figure

% Predict values for population sizes of 35,000 and 70,000
predict1 = [1, 3.5] *theta;
fprintf('For population = 35,000, we predict a profit of %f\n',...
    predict1*10000);
predict2 = [1, 7] * theta;
fprintf('For population = 70,000, we predict a profit of %f\n',...
    predict2*10000);

fprintf('Program paused. Press enter to continue.\n');

%% ============= Part 4: Visualizing J(theta_0, theta_1) =============
fprintf('Visualizing J(theta_0, theta_1) ...\n')

% Grid over which we will calculate J
theta0_vals = linspace(-10, 10, 100);
theta1_vals = linspace(-1, 4, 100);

% initialize J_vals to a matrix of 0's
J_vals = zeros(length(theta0_vals), length(theta1_vals));

% Fill out J_vals
for i = 1:length(theta0_vals)
    for j = 1:length(theta1_vals)
      t = [theta0_vals(i); theta1_vals(j)];
      J_vals(i,j) = computeCost(X, y, t);
    end
end

% Because of the way meshgrids work in the surf command, we need to
% transpose J_vals before calling surf, or else the axes will be flipped
J_vals = J_vals';
% Surface plot
figure;
surf(theta0_vals, theta1_vals, J_vals)
xlabel('\theta_0'); ylabel('\theta_1');

% Contour plot
figure;
% Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100
contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20))
xlabel('\theta_0'); ylabel('\theta_1');
hold on;
plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);
paulo-fernando-silva commented 5 years ago

Ok, I see what the problem is. I'll publish a fix either tomorrow or this Saturday. In the meanwhile you can press enter in the debug console to have it pass over the pause. Thanks

paulo-fernando-silva commented 5 years ago

I've just pushed v0.3.15 to the marketplace. Next time your use the extension it should auto-update. You can check in the extension tab to make sure you're using v0.3.15.

You should be able to run without breakpoints and get output of the program in the DEBUG CONSOLE. You can use pause, as long as it's not in a "step over", "step into" and "step out". That is, if you press F5 (continue) the pause will wait for your input in the DEBUG CONSOLE. Same for input(), keyboard(), etc.

In the limit you can also step over/into/out using the DEBUG CONSOLE, by typing dbstep and enter. Then each new enter should work as a step directly. This is the way octave-cli works by default. Since the DEBUG CONSOLE just forwards your commands to octave-cli you can interact with it as if it was a normal terminal.

However, when using F10 (Step Over), F11 (Step Into), shift+F11(Step Out) the extension will still send some commands back and forth to be able to track if the execution ended. I might try to change that in the future.

I was able to run that ex1 from beginning to end with and without breakpoints. It should be ok now. Let me know if this fixes the issue for you so we can close this bug.