blob: 0490b3dfd18571d718336516ff849431e48ff623 [file] [log] [blame]
% File src/library/utils/man/findLineNum.Rd
% Part of the R package, https://www.R-project.org
% Copyright 2009-2014 Duncan Murdoch and the R Core Team
% Distributed under GPL 2 or later
\name{findLineNum}
\alias{findLineNum}
\alias{setBreakpoint}
\title{
Find the Location of a Line of Source Code, or Set a Breakpoint There
}
\description{
These functions locate objects containing particular lines of source
code, using the information saved when the code was parsed with
\code{keep.source = TRUE}.
}
\usage{
findLineNum(srcfile, line, nameonly = TRUE,
envir = parent.frame(), lastenv)
setBreakpoint(srcfile, line, nameonly = TRUE,
envir = parent.frame(), lastenv, verbose = TRUE,
tracer, print = FALSE, clear = FALSE, ...)
}
\arguments{
\item{srcfile}{The name of the file containing the source code.}
\item{line}{The line number within the file. See Details for an
alternate way to specify this.}
\item{nameonly}{If \code{TRUE} (the default), we require only a match
to \code{basename(srcfile)}, not to the full path.}
\item{envir}{Where do we start looking for function objects?}
\item{lastenv}{Where do we stop? See the Details.}
\item{verbose}{Should we print information on where breakpoints were set?}
\item{tracer}{An optional \code{tracer} function to pass to
\code{\link{trace}}. By default, a call to \code{\link{browser}}
is inserted.}
\item{print}{The \code{print} argument to pass to \code{\link{trace}}.}
\item{clear}{If \code{TRUE}, call \code{\link{untrace}} rather than
\code{\link{trace}}.}
\item{\dots}{Additional arguments to pass to \code{\link{trace}}.}
}
\details{
The \code{findLineNum} function searches through all objects in
environment \code{envir}, its parent, grandparent, etc., all the way
back to \code{lastenv}.
\code{lastenv} defaults to the global environment if
\code{envir} is not specified, and to the
root environment \code{\link{emptyenv}()} if \code{envir} is
specified. (The first default tends to be quite fast, and will
usually find all user code other than S4 methods; the second one is
quite slow, as it will typically search all attached system
libraries.)
For convenience, \code{envir} may be specified indirectly: if it is
not an environment, it will be replaced with
\code{environment(envir)}.
\code{setBreakpoint} is a simple wrapper function for
\code{\link{trace}} and \code{\link{untrace}}. It will set or clear
breakpoints at the locations found by \code{findLineNum}.
The \code{srcfile} is normally a filename entered as a character
string, but it may be a \code{"\link{srcfile}"} object, or it may
include a suffix like \code{"filename.R#nn"}, in which case the number
\code{nn} will be used as a default value for \code{line}.
As described in the description of the \code{where} argument on the
man page for \code{\link{trace}}, the \R package system uses a
complicated scheme that may include more than one copy of a function
in a package. The user will typically see the public one on the
search path, while code in the package will see a private one in the
package namespace. If you set \code{envir} to the environment of a
function in the package, by default \code{findLineNum} will find both
versions, and \code{setBreakpoint} will set the breakpoint in both.
(This can be controlled using \code{lastenv}; e.g.,
\code{envir = environment(foo)}, \code{lastenv = globalenv()}
will find only the private copy, as the search is stopped before
seeing the public copy.)
S version 4 methods are also somewhat tricky to find. They are stored
with the generic function, which may be in the \pkg{base} or other
package, so it is usually necessary to have \code{lastenv = emptyenv()}
in order to find them. In some cases transformations are done by \R
when storing them and \code{findLineNum} may not be able to find the
original code. Many special cases, e.g.\sspace{}methods on primitive
generics, are not yet supported.
}
\value{
\code{findLineNum} returns a list of objects containing location
information. A \code{print} method is defined for them.
\code{setBreakpoint} has no useful return value; it is called for the
side effect of calling \code{\link{trace}} or \code{\link{untrace}}.
}
\author{
Duncan Murdoch
}
\seealso{
\code{\link{trace}}
}
\examples{
\dontrun{
# Find what function was defined in the file mysource.R at line 100:
findLineNum("mysource.R#100")
# Set a breakpoint in both copies of that function, assuming one is in the
# same namespace as myfunction and the other is on the search path
setBreakpoint("mysource.R#100", envir = myfunction)
}
}
\keyword{ debugging }