Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to start debugger only when condition is met

Assume I have a function which uses a loop over integer i. Now something goes wrong and I assume the error happens when i=5. Now I can step through every single step (what I did up to now).

But now I read about the condition and text argument of browser and debug:

text a text string that can be retrieved when the browser is entered.
condition a condition that can be retrieved when the browser is entered.

Is it possible to use the arguments in a way it works as I want?

Here is an example. The debugger / browser should only start after i=5 is reached:

fun <- function(x, y, n) {
  result <- 0
  for (i in 1:n) {
    # browser(condition = (i == 5)) # does not work
    result <- result + i * ( x + y)
  }
  return(result)
}

x <- 2
y <- 3
n <- 10

# debug(fun, condition = (i == 5)) # does not work
debug(fun)
r <- fun(x, y, n)
print(r)

The solution

if (i == 5) { # inside loop of fun()
  browser()
}

is working, but I thougt there might be something better (No extra code inside the function)

like image 436
Christoph Avatar asked Feb 27 '18 12:02

Christoph


People also ask

How do you set a conditional breakpoint?

To set a conditional breakpoint, activate the context menu in the source pane, on the line where you want the breakpoint, and select “Add Conditional Breakpoint”. You'll then see a textbox where you can enter the expression. Press Return to finish.

How do I set conditional breakpoint in Intellij?

Add a condition to a breakpoint when debugging. Right-click on a breakpoint to configure its behavior: for instance, you can add a condition so that the execution will only be stopped when that condition is met.

How do I apply a conditional breakpoint in Visual Studio?

Right-click the breakpoint symbol and select Conditions (or press Alt + F9, C). Or hover over the breakpoint symbol, select the Settings icon, and then select Conditions in the Breakpoint Settings window.

What is a breakpoint in debugging?

In software development, a breakpoint is an intentional stopping or pausing place in a program, put in place for debugging purposes. It is also sometimes simply referred to as a pause.


1 Answers

You can use the argument expr in browser():

fun <- function(x, y, n) {
  result <- 0
  for (i in 1:n) {
    browser(expr = {i == 5})
    result <- result + i * ( x + y)
  }
  return(result)
}

It will then only open the environment where browser() was called from if the expression evaluates to TRUE.

If you want to use debug():

debug(fun, condition = i == 5)

and then call the function:

fun <- function(x, y, n) {
  result <- 0
  for (i in 1:n) {
    result <- result + i * ( x + y)
  }
  return(result)
}

fun(x, y, n)
like image 77
clemens Avatar answered Nov 10 '22 13:11

clemens