CINXE.COM

Debugging

<!DOCTYPE html> <html> <head> <title>Debugging</title> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=3" /> <meta content="ImageJ Wiki" property="og:site_name"> <meta content="Debugging" property="og:title"> <meta content="article" property="og:type"> <meta content="The ImageJ wiki is a community-edited knowledge base on topics relating to ImageJ, a public domain program for processing and analyzing scientific images, and its ecosystem of derivatives and variants, including ImageJ2, Fiji, and others." property="og:description"> <meta content="https://imagej.github.io/develop/debugging" property="og:url"> <meta content="https://imagej.github.io/media/icons/imagej2.png" property="og:image"> <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> <link rel="manifest" href="/site.webmanifest"> <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="theme-color" content="#ffffff"> <link rel="stylesheet" href="/assets/css/lightbox.min.css" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/instantsearch.css@7/themes/algolia-min.css"/> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dygraphs@2.1.0/dist/dygraph.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/dygraphs@2.1.0/dist/dygraph.min.css" /> <link rel="stylesheet" href="/assets/css/main.css" /> <link rel="stylesheet" href="/assets/css/layout.css"/> <link rel="stylesheet" href="/assets/css/includes.css" /> <link rel="stylesheet" href="/assets/css/dock.css"/> <noscript><link rel="stylesheet" href="/assets/css/noscript.css" /></noscript> <link rel="stylesheet" href="/assets/css/page.css" /> </head> <body class="is-preload"> <!-- Top bar --> <section id="top-bar"> <a href="/"><img id="site-logo" src="/media/icons/imagej2.png"></a> <div id="search-panel"> <div id="search-box"></div> </div> </section> <!-- Page-info --> <div class="page-info"> <a href="https://github.com/imagej/imagej.github.io/commits/main/_pages/develop/debugging.md">Page history</a> <a href="https://github.com/imagej/imagej.github.io/edit/main/_pages/develop/debugging.md">Edit this page</a> <a href="/editing">How do I edit this website?</a><br><a href="https://imagej.net/imagej-wiki-static/Debugging">Original MediaWiki page</a></div> <section id="left-column" class="sidebar dock"> <!-- Menu --> <div class="menu dockable"> <div class="drag-handle"></div><h3>ImageJ Docs</h3> <ul> <li><a href="/downloads">Download</a></li> <li><details><summary>Learn</summary><ul> <li><details><summary><a href="/learn">ImageJ Basics</a></summary><ul> <li><a href="/tutorials">Tutorials</a></li> <li><a href="/learn/user-guides">User Guides</a></li> <li><a href="/learn/keyboard-shortcuts">Keyboard Shortcuts</a></li> <li><a href="/learn/tips-and-tricks">Tips and Tricks</a></li> <li><a href="/learn/troubleshooting">Troubleshooting</a></li> <li><a href="/learn/faq">Frequently Asked Questions</a></li> <li><details><summary><a href="/platforms">Supported Platforms</a></summary><ul> <li><a href="/platforms/windows">Windows</a></li> <li><a href="/platforms/macos">MacOS</a></li> <li><a href="/platforms/linux">Linux</a></li> <li><a href="/platforms/pi">Raspberry Pi</a></li> <li><a href="/platforms/android">Android</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/Supported Platforms --> <li><details><summary><a href="/formats">File Formats</a></summary><ul> <li><a href="/formats/bio-formats">Bio-Formats</a></li> <li><a href="/formats/video">Video formats</a></li> <li><a href="/formats/quicktime">QuickTime</a></li> <li><a href="/formats/tiff">TIFF</a></li> <li><a href="/formats/pdf">PDF</a></li> <li><a href="/formats/dicom">DICOM</a></li> <li><a href="/formats/lsm">Zeiss LSM</a></li> <li><a href="/formats/olympus">Olympus VSI</a></li> <li><a href="/formats/lurawave">Opera Flex</a></li> <li><a href="/formats/fib-sem">FIB-SEM</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/File Formats --> </ul></details></li> <!-- Learn/ImageJ --> <li><details><summary><a href="/imaging">Scientific Imaging</a></summary><ul> <li><a href="/imaging/principles">Principles of Scientific Imaging</a></li> <li><a href="/imaging/annotating-images">Annotating Images</a></li> <li><a href="/imaging/colocalization-analysis">Colocalization</a></li> <li><a href="/imaging/color-image-processing">Color Image Processing</a></li> <li><a href="/imaging/deconvolution">Deconvolution</a></li> <li><a href="/imaging/image-intensity-processing">Image Intensity Processing</a></li> <li><a href="/imaging/particle-analysis">Particle Analysis</a></li> <li><a href="/imaging/registration">Registration</a></li> <li><a href="/imaging/segmentation">Segmentation</a></li> <li><a href="/imaging/stack-slice-manipulations">Stack-slice Manipulations</a></li> <li><a href="/imaging/t-functions">T-functions</a></li> <li><a href="/imaging/tracking">Tracking</a></li> <li><a href="/imaging/visualization">Visualization</a></li> <li><a href="/imaging/z-functions">Z-functions</a></li> </ul></details></li> <!-- Learn/Scientific Imaging --> </ul></details></li> <!-- Learn --> <li><details open><summary><a href="/plugins">Extend</a></summary><ul> <li><a href="/list-of-extensions">List of Extensions</a></li> <li><details><summary><a href="/update-sites">Update Sites</a></summary><ul> <li><a href="/list-of-update-sites">List of Update Sites</a></li> <li><a href="/update-sites/following">Following an Update Site</a></li> <li><a href="/update-sites/setup">Creating an Update Site</a></li> <li><a href="/update-sites/tos">Terms of Service</a></li> <li><a href="/update-sites/automatic-uploads">Automatic Upload</a></li> <li><a href="/update-sites/core-uploads">Uploading to Core Sites</a></li> <li><a href="/update-sites/faq">Update Sites FAQ</a></li> <li><a href="/update-sites/stats">Statistics</a></li> </ul></details></li> <!-- Extend/Update Sites --> <li><details><summary><a href="/scripting">Scripting</a></summary><ul> <li><a href="/scripting/basics">Scripting Basics</a></li> <li><a href="/scripting/script-editor">Script Editor</a></li> <li><a href="/scripting/parameters">Parameters</a></li> <li><a href="/scripting/user-input">User Input</a></li> <li><a href="/scripting/auto-imports">Auto Import</a></li> <li><a href="/scripting/templates">Templates</a></li> <li><a href="/scripting/batch">Batch Processing</a></li> <li><a href="/scripting/headless">Running Headlessly</a></li> <li><a href="/scripting/comparisons">Scripting Comparisons</a></li> <li><a href="/scripting/toolbox">Toolbox</a></li> <li><details><summary>Languages</summary><ul> <li><a href="/scripting/beanshell">BeanShell Scripting</a></li> <li><a href="/scripting/groovy">Groovy Scripting</a></li> <li><a href="/scripting/macro">ImageJ Macro</a></li> <li><a href="/scripting/javascript">JavaScript</a></li> <li><a href="/scripting/clojure">Lisp (Clojure)</a></li> <li><a href="/scripting/matlab">MATLAB</a></li> <li><a href="/scripting/jython">Python (Jython)</a></li> <li><a href="/scripting/python">Python (native)</a></li> <li><a href="/scripting/renjin">R (Renjin)</a></li> <li><a href="/scripting/jruby">Ruby (JRuby)</a></li> <li><a href="/scripting/scala">Scala Scripting</a></li> </ul></details></li> <!-- Extend/Scripting/Languages --> </ul></details></li> <!-- Extend/Scripting --> <li><details open><summary><a href="/develop">Development</a></summary><ul> <li><a href="/develop/philosophy">Philosophy</a></li> <li><a href="/develop/architecture">Architecture</a></li> <li><a href="/develop/source">Source code</a></li> <li><a href="/develop/project-management">Project management</a></li> <li><a href="/develop/coding-style">Coding style</a></li> <li><a href="/develop/javadoc">Using Javadoc</a></li> <li><a class="current-page">Debugging</a></li> <li><a href="/develop/wish-list">Wish list</a></li> <li><details><summary>Tools</summary><ul> <li><a href="/develop/github">GitHub</a></li> <li><a href="/develop/maven">Maven</a></li> <li><a href="/develop/ci">CI/CD</a></li> <li><a href="/develop/dotfiles">Dotfiles</a></li> <li><details><summary><a href="/develop/ides">IDEs</a></summary><ul> <li><a href="/develop/eclipse">Eclipse</a></li> <li><a href="/develop/netbeans">NetBeans</a></li> <li><a href="/develop/intellij">IntelliJ IDEA</a></li> <li><a href="/develop/command-line">Command Line</a></li> </ul></details></li> </ul></details></li> <!-- Extend/Development/Tools --> <li><details><summary>Guides</summary><ul> <li><a href="/develop/plugins">Writing plugins</a></li> <li><a href="/develop/improving-the-code">Contributing to a plugin</a></li> <li><a href="/develop/releasing">Development lifecycle</a></li> <li><a href="/develop/building-a-pom">Building a POM</a></li> <li><a href="/develop/debugging-exercises">Hands-on debugging</a></li> <li><a href="/develop/writing-ops">Adding new ops</a></li> <li><a href="/develop/formats">Adding new formats</a></li> <li><a href="/develop/native-libraries">Using native libraries</a></li> <li><a href="/develop/tips">Tips for developers</a></li> <li><a href="/develop/cpp-tips">Tips for C++ developers</a></li> <li><a href="/develop/ij1-plugins">ImageJ 1.x plugins</a></li> <li><a href="/develop/versioning">Versioning</a></li> <li><a href="/develop/logging">Logging</a></li> <li><a href="/develop/uber-jars">Uber-JARs</a></li> </ul></details></li> <!-- Extend/Development/Guides --> <li><details><summary><a href="/develop/git">Git</a></summary><ul> <li><a href="/develop/git/eclipse">Git in Eclipse (EGit)</a></li> <li><a href="/develop/git/mini-howto">Git mini howto</a></li> <li><a href="/develop/git/workshop">Git workshop</a></li> <li><a href="/develop/git/conflicts">Git conflicts</a></li> <li><a href="/develop/git/topic-branches">Git topic branches</a></li> <li><a href="/develop/git/notes">Git notes</a></li> <li><a href="/develop/git/reflogs">Git reflogs</a></li> <li><a href="/develop/git/submodules">Git submodules</a></li> <li><a href="/develop/git/pinpoint-regressions">How to pinpoint regressions</a></li> <li><a href="/develop/git/publish-a-repository">How to publish a git repository</a></li> <li><a href="/develop/git/extract-a-subproject">How to extract a subproject</a></li> </ul></details></li> <!-- Extend/Development/Git --> </ul></details></li> <!-- Extend/Development --> </ul></details></li> <!-- Extend --> <li><details><summary><a href="/contribute">Contribute</a></summary><ul> <li><a href="/contribute/citing">Citing</a></li> <li><a href="/people">Contributors</a></li> <li><a href="/orgs">Organizations</a></li> <li><a href="/contribute/governance">Governance</a></li> <li><a href="/contribute/funding">Funding</a></li> <li><a href="/contribute/fiji">Contributing to Fiji</a></li> <li><details><summary><a href="/licensing">Licensing</a></summary><ul> <li><details><summary><a href="/licensing/open-source">Open Source</a></summary><ul> <li><a href="/licensing/apache">Apache</a></li> <li><a href="/licensing/bsd">BSD</a></li> <li><a href="/licensing/epl">EPL</a></li> <li><a href="/licensing/gpl">GPL</a></li> <li><a href="/licensing/lgpl">LGPL</a></li> <li><a href="/licensing/mit">MIT</a></li> <li><a href="/licensing/public-domain">Public domain</a></li> <li><a href="/licensing/big">BIG</a></li> </ul></details></li> <!-- Contribute/Licensing/Open Source --> <li><a href="/licensing/closed-source">Proprietary</a></li> </ul></details></li> <!-- Contribute/Licensing --> <li><details><summary><a href="/editing">Editing the Wiki</a></summary><ul> <li><a href="/editing/advanced">Advanced Editing</a></li> <li><a href="/editing/buttons">Buttons</a></li> <li><a href="/editing/citations">Citations</a></li> <li><a href="/editing/code">Source Code</a></li> <li><a href="/editing/debugging">Debugging</a></li> <li><a href="/editing/headers">Headers</a></li> <li><a href="/editing/icons">Icons</a></li> <li><a href="/editing/images">Images</a></li> <li><a href="/editing/keys">Keyboard Shortcuts</a></li> <li><a href="/editing/linking">Linking</a></li> <li><a href="/editing/math">Math Expressions</a></li> <li><a href="/editing/menu-paths">Menu Paths</a></li> <li><a href="/editing/navigation">Navigation</a></li> <li><a href="/editing/notices">Notices</a></li> <li><a href="/editing/people">People</a></li> <li><a href="/editing/pitfalls">Pitfalls</a></li> <li><a href="/editing/quizzes">Quizzes</a></li> <li><a href="/editing/statbox">Statbox</a></li> <li><a href="/editing/symbols">Symbols</a></li> <li><a href="/editing/tables">Tables</a></li> <li><a href="/editing/tooltips">Tooltips</a></li> <li><a href="/editing/videos">Videos</a></li> <li><a href="/editing/whitespace">Whitespace</a></li> </ul></details></li> <!-- Contribute/Editing the Wiki --> </ul></details></li> <!-- Contribute --> <li><details><summary><a href="/discuss">Discuss</a></summary><ul> <li><a href="/discuss/bugs">Reporting Issues</a></li> <li><a href="/discuss/mailing-lists">Mailing Lists</a></li> <li><a href="/discuss/chat">Chat</a></li> </ul></details></li> <!-- Discuss --> <li><details><summary>Explore</summary><ul> <li><a href="/news">News</a></li> <li><details><summary><a href="/events">Events</a></summary><ul> <li><a href="/events/presentations">Presentations</a></li> <li><a href="/events/conferences">Conferences</a></li> <li><a href="/events/hackathons">Hackathons</a></li> <li><a href="/events">More...</a></li> </ul></details></li> <!-- Discuss/Events --> <li><details><summary><a href="/libs">Libraries</a></summary><ul> <li><a href="/libs/imagej-ops">ImageJ Ops</a></li> <li><a href="/libs/imagej-common">ImageJ Common</a></li> <li><a href="/libs/imagej-legacy">ImageJ Legacy</a></li> <li><a href="/libs/scijava">SciJava</a></li> <li><a href="/libs/scifio">SCIFIO</a></li> <li><details><summary><a href="/libs/imglib2">ImgLib2</a></summary><ul> <li><a href="/libs/imglib2/getting-started">Getting Started</a></li> <li><a href="/libs/imglib2/accessors">Accessors</a></li> <li><a href="/libs/imglib2/accessibles">Accessibles</a></li> <li><a href="/libs/imglib2/examples">Examples</a></li> <li><a href="/libs/imglib2/workshop-introductory">Introductory Workshop</a></li> <li><a href="/libs/imglib2/workshop-advanced">Advanced Workshop</a></li> <li><a href="/libs/imglib2/matlab">ImgLib2 images in MATLAB</a></li> <li><a href="/libs/imglib2/benchmarks">Benchmarks</a></li> <li><a href="/libs/imglib2/faq">FAQ</a></li> <li><a href="/libs/imglib2/developing">Developing ImgLib2</a></li> <li><a href="/libs/imglib2/discussion">ImgLib2 Discussion</a></li> </ul></details></li> <!-- Explore/Libraries/ImgLib2 --> <li><a href="/libs">More...</a></li> </ul></details></li> <!-- Explore/Libraries --> <li><details><summary><a href="/software">Software</a></summary><ul> <li><a href="/software/nih-image">NIH Image</a></li> <li><a href="/software/imagej">ImageJ</a></li> <li><a href="/software/imagej2">ImageJ2</a></li> <li><a href="/software/fiji">Fiji</a></li> <li><a href="/software">More...</a></li> </ul></details></li> <!-- Explore/Software --> </ul></details></li> <!-- Explore --> </ul> </div> </section> <section id="right-column" class="sidebar dock"> <!-- Vital stats --> <!-- Table of contents --> <div id="toc" class="toc menu dockable"> <div class="drag-handle"></div> <h3>Page contents</h3> <ul data-toc="#content" data-toc-headings="h1,h2,h3,h4,h5,h6"></ul> </div> </section> <!-- Page title --> <div class="container"> <header class="major special"> <h1>Debugging</h1> </header> </div> <!-- Nav bar --> <!-- Main content --> <section id="page" class="main style1"> <div class="container"> <div class="box alt"></div> <div id="content" class="page-content"> <div class="notice" style="font-size: 2; background: #ebf2f8; border-left: 10px solid #67a1fe"><div class="notice-icon"><img src="/media/icons/info.svg" width="32"></div><div class="notice-content"><p>The content of this page has not been vetted since shifting away from MediaWiki. If you’d like to help, check out the <a href="/events/wiki-grand-opening/how-to-help">how to help guide</a>!</p> </div> </div> <div class="notice" style="font-size: 2; background: #ebf2f8; border-left: 10px solid #67a1fe"><div class="notice-icon"><img src="/media/icons/info.svg" width="32" /></div><div class="notice-content"><p>This page has approaches for <em>software developers</em> to use for debugging ImageJ. If you are a <em>user</em> looking to troubleshoot issues, see the <a href="/learn/troubleshooting">Troubleshooting</a> page.</p> </div> </div> <h1 id="launching-imagej-in-debug-mode">Launching ImageJ in debug mode</h1> <p>To debug problems with ImageJ, it is often helpful to launch it in debug mode. See the <a href="/learn/troubleshooting#launching-imagej-from-the-console">Troubleshooting</a> page for instructions.</p> <h2 id="attaching-to-imagej-instances">Attaching to ImageJ instances</h2> <p>Sometimes, we need to debug things directly in ImageJ, for example because there might be issues with the plugin discovery (ImageJ wants to find the plugins in <code class="language-plaintext highlighter-rouge">&lt;ImageJ&gt;/plugins/</code>, and often we want to bundle them as <code class="language-plaintext highlighter-rouge">.jar</code> files, both of which are incompatible with Eclipse debugging). JDWP (<em>Java Debug Wire Protocol</em>) to the rescue!</p> <p>After starting the Java Virtual Machine in a special mode, debuggers (such as Eclipse’s built-in one) can attach to it. To start ImageJ in said mode, you need to pass the <code class="language-plaintext highlighter-rouge">--debugger=&lt;port&gt;</code> option:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./ImageJ-linux64 <span class="nt">--debugger</span><span class="o">=</span>8000 </code></pre></div></div> <p>In Eclipse (or whatever <a href="https://en.wikipedia.org/wiki/JDWP">JDWP</a>-enabled debugger) select the correct project so that the source code can be found, mark the break-points where you want execution to halt (e.g. to inspect variables’ values), and after clicking on <span class="bc"><span>Run</span> › <span>Debug Configurations…</span></span> right-click on the <em>Remote Java Application</em> item in the left-hand side list and select <em>New</em>. Now you only need to make sure that the port matches the value that you specified (in the example above, <code class="language-plaintext highlighter-rouge">8000</code>, Eclipse’s default port number).</p> <p>If you require more control over the ImageJ side—such as picking a semi-random port if port 8000 is already in use—you can also use the <code class="language-plaintext highlighter-rouge">-agentlib:jdwp=...</code> Java option directly (<code class="language-plaintext highlighter-rouge">--debugger=&lt;port&gt;</code> is just a shortcut for convenience):</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./ImageJ-linux64 -agentlib:jdwp=server=y,suspend=y,transport=dt_socket,address=localhost:8000 -- </code></pre></div></div> <p>(the <code class="language-plaintext highlighter-rouge">--</code> marker separates the Java options—if any—from the ImageJ options). Once started that way, ImageJ will wait for the debugger to be attached, after printing a message such as:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt; Listening for transport dt\_socket at address: 46317 </code></pre></div></div> <div class="notice" style="font-size: 2; background: #ebf2f8; border-left: 10px solid #67a1fe"><div class="notice-icon"><img src="/media/icons/info.svg" width="32" /></div><div class="notice-content"><p>Calling <code class="language-plaintext highlighter-rouge">imagej -agentlib:jdwp=help --</code> will print nice usage information with documentation of other JDWP options.</p> </div> </div> <h2 id="attach-imagej-to-a-waiting-eclipse">Attach ImageJ to a waiting Eclipse</h2> <p>Instead of making ImageJ <a href="#attaching-to-imagej-instances">the debugging server</a>, when debugging startup events and headless operations it is easier to make ImageJ the client and Eclipse (or equivalent) the server.</p> <p>In this case you start the debugging session first, e.g. in Eclipse debug configurations you specify “Standard (Socket Listen)” as the connection type. Then, simply start ImageJ without the <code class="language-plaintext highlighter-rouge">server=y</code> flag to connect and debug:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./ImageJ-linux64 <span class="nt">-agentlib</span>:jdwp<span class="o">=</span><span class="nb">suspend</span><span class="o">=</span>y,transport<span class="o">=</span>dt_socket,address<span class="o">=</span>localhost:8000 <span class="nt">--</span> </code></pre></div></div> <h1 id="monitoring-system-calls">Monitoring system calls</h1> <h2 id="linux">Linux</h2> <p>On Linux, you should call ImageJ using the <a href="http://www.linuxmanpages.com/man1/strace.1.php">strace command</a>:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>strace <span class="nt">-Ffo</span> syscall.log ./imagej &lt;args&gt; </code></pre></div></div> <h2 id="macos">macOS</h2> <p>Use the <code class="language-plaintext highlighter-rouge">dtruss</code> wrapper around <a href="http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/dtrace.1.html">dtrace</a> to monitor system calls:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dtruss ./imagej &lt;args&gt; </code></pre></div></div> <h2 id="windows">Windows</h2> <p>To monitor all kinds of aspects of processes on Windows, use <a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx">Sysinternal’s Process Monitor</a>.</p> <h1 id="debugging-shared-dynamic-library-issues">Debugging shared (dynamic) library issues</h1> <h2 id="linux-1">Linux</h2> <p>Set the <code class="language-plaintext highlighter-rouge">LD_DEBUG</code> environment variable before launching ImageJ:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">LD_DEBUG</span><span class="o">=</span>1 ./imagej &lt;args&gt; </code></pre></div></div> <h2 id="macos-1">macOS</h2> <p>Set the <code class="language-plaintext highlighter-rouge">DYLD_PRINT_APIS</code> environment variable before launching ImageJ:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">DYLD_PRINT_APIS</span><span class="o">=</span>1 ./imagej &lt;args&gt; </code></pre></div></div> <h2 id="windows-1">Windows</h2> <p>Often, dynamic library issues are connected to a dependent .dll file missing. Download <a href="http://www.dependencywalker.com/">depends.exe</a> and load the .dll file you suspect is missing a dependency.</p> <h1 id="debugging-jvm-hangs">Debugging JVM hangs</h1> <p>When the Java VM hangs, the reason might be a dead-lock. Try taking a <a href="/learn/troubleshooting#if-imagej-freezes-or-hangs">stack trace</a>. If you have trouble, you can try one of the following advanced techniques:</p> <ol> <li> <p>You can use the <code class="language-plaintext highlighter-rouge">jstack</code> command (you don’t need to run ImageJ from the command line in this case). This requires that you first find the PID (process ID) of ImageJ. You can do so by running: jps</p> <p>from the command line to print a list of running Java processes. If you’re not sure which PID is ImageJ’s, you can close ImageJ, run <code class="language-plaintext highlighter-rouge">jps</code>, open ImageJ and run <code class="language-plaintext highlighter-rouge">jps</code> again. Whichever PID is present in the second run but not the first is ImageJ’s. Then, to acquire a stack trace, just run:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>jstack &lt;ImageJ<span class="s1">'s PID&gt; </span></code></pre></div> </div> </li> <li> <p>For GUI-based debugging, can also attach to the ImageJ PID using the <code class="language-plaintext highlighter-rouge">jvisualvm</code> program that you can find in <code class="language-plaintext highlighter-rouge">java/&lt;platform&gt;/&lt;jdk&gt;/bin/</code>. Here you can simply press a big <em>Thread Dump</em> button to view the stack trace.</p> </li> </ol> <p>Regardless of which method you use to acquire the stack trace, to debug you will want to acquire multiple stack traces over time and compare. If all the stack traces are in the same method execution, then that’s the source of the deadlock (or slowdown).</p> <h1 id="debugging-memory-leaks">Debugging memory leaks</h1> <p>Sometimes, memory is not released properly, leading to <code class="language-plaintext highlighter-rouge">OutOfMemoryException</code>.</p> <p>One way to find out what is happening is to use <code class="language-plaintext highlighter-rouge">jvisualvm</code> (see <a href="#debugging-jvm-hangs">#Debugging JVM hangs</a>) to connect to the ImageJ process, click on <em>Heap Dump</em> in the <em>Monitor</em> tab, in said tab select the sub-tab <em>Classes</em> and sort by size. Double-clicking on the top user should get you to a detailed list of <em>Instances</em> where you can expand the tree of references to find out what is holding a reference still.</p> <h1 id="debugging-hard-jvm-crashes">Debugging hard JVM crashes</h1> <p>When you have found an issue that crashes the JVM, and you can repeat that crash reliably, there are a number of options to find out what is going on.</p> <h2 id="using-gdb">Using gdb</h2> <p>Typically when you debug a program that crashes, you start it in a debugger, to inspect the stack trace and the variables at the time of the crash. However, there are substantial problems with gdb when starting the Java VM; either gdb gets confused by segmentation faults (used by the JVM to handle NullPointerExceptions in an efficient manner), or it gets confused by the threading system—unless you compile gdb yourself.</p> <p>But there is a very easy method to use gdb to inspect serious errors such as segmentation faults or trap signals nevertheless:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./imagej <span class="nt">-XX</span>:OnError<span class="o">=</span><span class="s2">"gdb - %p"</span> <span class="nt">--</span> </code></pre></div></div> <h2 id="using-lldb">Using lldb</h2> <p>On newer macOS versions, gdb has been replaced with lldb. For those familiar with gdb already, there is an <a href="http://lldb.llvm.org/lldb-gdb.html">LLDB to GDB Command Map</a> cheat sheet which may be useful.</p> <h2 id="using-the-hs_err_pidpidlog-files">Using the <code class="language-plaintext highlighter-rouge">hs_err_pid&lt;pid&gt;.log</code> files</h2> <p>The Java virtual machine (JVM) frequently leaves files of the format <code class="language-plaintext highlighter-rouge">hs_err_pid&lt;number&gt;.log</code> in the current working directory after a crash. Such a file starts with a preamble similar to this:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#</span> <span class="c"># A fatal error has been detected by the Java Runtime Environment:</span> <span class="c">#</span> <span class="c"># SIGSEGV (0xb) at pc=0x00007f3dc887dd8b, pid=12116, tid=139899447723792</span> <span class="c">#</span> <span class="c"># JRE version: 6.0_20-b02</span> <span class="c"># Java VM: Java HotSpot(TM) 64-Bit Server VM (16.3-b01 mixed mode linux-amd64 )</span> <span class="c"># Problematic frame:</span> <span class="c"># C [libc.so.6+0x86d8b] memcpy+0x15b</span> <span class="c">#</span> <span class="c"># If you would like to submit a bug report, please visit:</span> <span class="c"># http://java.sun.com/webapps/bugreport/crash.jsp</span> <span class="c"># The crash happened outside the Java Virtual Machine in native code.</span> <span class="c"># See problematic frame for where to report the bug.</span> <span class="c">#</span> </code></pre></div></div> <p>followed by thread dumps and other useful information including the command-line arguments passed to the JVM.</p> <p>The most important part is the line after the line <code class="language-plaintext highlighter-rouge"># Problematic frame:</code> because it usually gives you an idea in which component the crash was triggered.</p> <h2 id="out-of-memory-error">Out of memory error</h2> <p>If the specific exception you’re receiving (or you suspect) is an <code class="language-plaintext highlighter-rouge">OutOfMemoryError</code>, there are JVM flags that can be enabled when running ImageJ to help pinpoint the problem:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./imagej <span class="nt">-XX</span>:+HeapDumpOnOutOfMemoryError <span class="nt">-XX</span>:HeapDumpPath<span class="o">=</span>/desired/path/ </code></pre></div></div> <p>The first option:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-XX</span>:+HeapDumpOnOutOfMemoryError </code></pre></div></div> <p>tells the JVM to create a heap dump (.hprof file) if an <code class="language-plaintext highlighter-rouge">OutOfMemoryError</code> is thrown. This is basically a snapshot of the JVM state when memory ran out.</p> <p>The second option:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-XX</span>:HeapDumpPath<span class="o">=</span>/desired/path/ </code></pre></div></div> <p>is not required, but convenient for controlling where the resulting <code class="language-plaintext highlighter-rouge">.hprof</code> file is written. Note that these heap dumps are named by PID, and thus are not easily human distinguishable.</p> <p>After acquiring a heap dump, you can analyze it yourself, e.g. with a <a href="http://www.eclipse.org/mat/">memory analyzer</a>, or post on the <a href="/discuss">Image.sc Forum</a> with a brief explanation of your problem.</p> <h1 id="debugging-java-code-with-jdb">Debugging Java code with jdb</h1> <h2 id="how-to-attach-the-java-debugger-jdb-to-a-running-imagej-process">How to attach the Java debugger jdb to a running ImageJ process</h2> <p>This requires two separate processes, ImageJ itself and the debugger. You can do this either in one shell, backgrounding the first process or in two shells, this is recommended. In the two shells do the following:</p> <p>Shell 1 In the first shell, start ImageJ with special parameters to open a port (8000 in this case) to which jdb can connect afterwards:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./ImageJ-linux64 <span class="nt">--debugger</span><span class="o">=</span>8000,suspend<span class="o">=</span>y <span class="nt">--</span> </code></pre></div></div> <p>Shell 2 In the second shell, tell <code class="language-plaintext highlighter-rouge">jdb</code> to attach to that port:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>jdb <span class="nt">-attach</span> 8000 </code></pre></div></div> <h2 id="this-is-an-ultra-quick-start-to-jdb-the-default-java-debugger">This is an ultra quick start to jdb, the default Java debugger</h2> <p>Hopefully you are a little familiar with gdb, since jdb resembles it lightly.</p> <p>Notable differences:</p> <ul> <li>a breakpoint is set with “stop in <class>.<method>" or "<class>:<line>". Just remember that the class must be fully specified, i.e. <package>.&lt;subpackages...&gt;.<classname></classname></package></line></class></method></class></li> <li>no tab completion</li> <li>no readline (cursor up/down)</li> <li>no shortcuts; you have to write “run”, not “r” to run the program</li> <li>no listing files before the class was loaded</li> <li>much easier method to specify the location of the source: “use <dir> " </dir> </li> <li>“until” is “step”, “step” is “stepi”</li> </ul> <p>Okay, so here you go, a little demonstration:</p> <p>(If you attach jdb to a running ImageJ process, you have to use the line from the previous section instead.)</p> <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">$</span> <span class="n">jdb</span> <span class="o">-</span><span class="n">classpath</span> <span class="n">ij</span><span class="o">.</span><span class="na">jar</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImageJ</span> <span class="o">&gt;</span> <span class="n">stop</span> <span class="n">in</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImageJ</span><span class="o">.</span><span class="na">main</span> <span class="nc">Deferring</span> <span class="n">breakpoint</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImageJ</span><span class="o">.</span><span class="na">main</span><span class="o">.</span> <span class="nc">It</span> <span class="n">will</span> <span class="n">be</span> <span class="n">set</span> <span class="n">after</span> <span class="n">the</span> <span class="kd">class</span> <span class="nc">is</span> <span class="n">loaded</span><span class="o">.</span> <span class="o">&gt;</span> <span class="n">run</span> <span class="n">run</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImageJ</span> <span class="nc">Set</span> <span class="n">uncaught</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Throwable</span> <span class="nc">Set</span> <span class="n">deferred</span> <span class="n">uncaught</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Throwable</span> <span class="o">&gt;</span> <span class="no">VM</span> <span class="nl">Started:</span> <span class="nc">Set</span> <span class="n">deferred</span> <span class="n">breakpoint</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImageJ</span><span class="o">.</span><span class="na">main</span> <span class="nc">Breakpoint</span> <span class="nl">hit:</span> <span class="s">"thread=main"</span><span class="o">,</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImageJ</span><span class="o">.</span><span class="na">main</span><span class="o">(),</span> <span class="n">line</span><span class="o">=</span><span class="mi">466</span> <span class="n">bci</span><span class="o">=</span><span class="mi">0</span> <span class="n">main</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="n">use</span> <span class="o">.</span> <span class="n">main</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="n">list</span> <span class="mi">462</span> <span class="c1">//prefs.put(IJ_HEIGHT, Integer.toString(size.height));</span> <span class="mi">463</span> <span class="o">}</span> <span class="mi">464</span> <span class="mi">465</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span> <span class="n">args</span><span class="o">[])</span> <span class="o">{</span> <span class="mi">466</span> <span class="o">=&gt;</span> <span class="k">if</span> <span class="o">(</span><span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="s">"java.version"</span><span class="o">).</span><span class="na">substring</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span><span class="mi">3</span><span class="o">).</span><span class="na">compareTo</span><span class="o">(</span><span class="s">"1.4"</span><span class="o">)&lt;</span><span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="mi">467</span> <span class="n">javax</span><span class="o">.</span><span class="na">swing</span><span class="o">.</span><span class="na">JOptionPane</span><span class="o">.</span><span class="na">showMessageDialog</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span><span class="s">"ImageJ "</span><span class="o">+</span><span class="no">VERSION</span><span class="o">+</span><span class="s">" requires Java 1.4.1 or later."</span><span class="o">);</span> <span class="mi">468</span> <span class="nc">System</span><span class="o">.</span><span class="na">exit</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span> <span class="mi">469</span> <span class="o">}</span> <span class="mi">470</span> <span class="kt">boolean</span> <span class="n">noGUI</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span> <span class="mi">471</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">args</span><span class="o">;</span> <span class="n">main</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="n">print</span> <span class="n">args</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">IndexOutOfBoundsException</span><span class="o">:</span> <span class="nc">Invalid</span> <span class="n">array</span> <span class="nl">range:</span> <span class="mi">0</span> <span class="n">to</span> <span class="mi">0</span> <span class="n">args</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">=</span> <span class="kc">null</span> <span class="n">main</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="n">print</span> <span class="n">args</span><span class="o">.</span><span class="na">length</span> <span class="n">args</span><span class="o">.</span><span class="na">length</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">main</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="n">step</span> <span class="o">&gt;</span> <span class="nc">Step</span> <span class="nl">completed:</span> <span class="s">"thread=main"</span><span class="o">,</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImageJ</span><span class="o">.</span><span class="na">main</span><span class="o">(),</span> <span class="n">line</span><span class="o">=</span><span class="mi">470</span> <span class="n">bci</span><span class="o">=</span><span class="mi">28</span> <span class="mi">470</span> <span class="kt">boolean</span> <span class="n">noGUI</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span> <span class="n">main</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="n">step</span> <span class="o">&gt;</span> <span class="nc">Step</span> <span class="nl">completed:</span> <span class="s">"thread=main"</span><span class="o">,</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImageJ</span><span class="o">.</span><span class="na">main</span><span class="o">(),</span> <span class="n">line</span><span class="o">=</span><span class="mi">471</span> <span class="n">bci</span><span class="o">=</span><span class="mi">30</span> <span class="mi">471</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">args</span><span class="o">;</span> <span class="n">main</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="n">set</span> <span class="n">noGUI</span> <span class="o">=</span> <span class="kc">true</span> <span class="n">noGUI</span> <span class="o">=</span> <span class="kc">true</span> <span class="o">=</span> <span class="kc">true</span> <span class="n">main</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="n">cont</span> <span class="o">&gt;</span> <span class="nc">The</span> <span class="n">application</span> <span class="n">exited</span> </code></pre></div></div> <h1 id="inspecting-serialized-objects">Inspecting serialized objects</h1> <p>If you have a file with a serialized object, you can use this BeanShell in the <a href="/scripting/script-editor">Script Editor</a> to open a tree view of the object (double-click to open/close the branches of the view):</p> <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">fiji.debugging.Object_Inspector</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">ij.io.OpenDialog</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.io.FileInputStream</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.io.ObjectInputStream</span><span class="o">;</span> <span class="n">dialog</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">OpenDialog</span><span class="o">(</span><span class="s">"Classifier"</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span> <span class="k">if</span> <span class="o">(</span><span class="n">dialog</span><span class="o">.</span><span class="na">getDirectory</span><span class="o">()</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="n">path</span> <span class="o">=</span> <span class="n">dialog</span><span class="o">.</span><span class="na">getDirectory</span><span class="o">()</span> <span class="o">+</span> <span class="s">"/"</span> <span class="o">+</span> <span class="n">dialog</span><span class="o">.</span><span class="na">getFileName</span><span class="o">();</span> <span class="n">in</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">FileInputStream</span><span class="o">(</span><span class="n">path</span><span class="o">);</span> <span class="n">in</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ObjectInputStream</span><span class="o">(</span><span class="n">in</span><span class="o">);</span> <span class="n">object</span> <span class="o">=</span> <span class="n">in</span><span class="o">.</span><span class="na">readObject</span><span class="o">();</span> <span class="n">in</span><span class="o">.</span><span class="na">close</span><span class="o">();</span> <span class="n">Object_Inspector</span><span class="o">.</span><span class="na">openFrame</span><span class="o">(</span><span class="s">"classifier"</span><span class="o">,</span> <span class="n">object</span><span class="o">);</span> <span class="o">}</span> </code></pre></div></div> <h1 id="debugging-swing-event-dispatch-thread-issues">Debugging Swing (Event Dispatch Thread) issues</h1> <p>Swing does not allow us to call all the methods on all UI objects from wherever we want. Some things, such as <code class="language-plaintext highlighter-rouge">setVisible(true)</code> or <code class="language-plaintext highlighter-rouge">pack()</code> need to be called on the Event Dispatch Thread (AKA EDT). See Sun’s <a href="http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html">detailed explanation</a> as to why this is the case.</p> <p>There are a couple of ways to test for such EDT violations, see <a href="http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html">this blog post by Alexander Potochkin</a> (current versions of debug.jar can be found <a href="http://java.net/projects/swinghelper/sources/svn/show/trunk/www/bin">here</a>).</p> <h1 id="debugging-java3d-issues">Debugging Java3D issues</h1> <p>When Java3D does not work, the first order of business is to use <span class="bc"><span>Plugins</span> › <span>Utilities</span> › <span>Debugging</span> › <span>Test Java3D</span></span>. If this shows a rotating cube, but the <a href="/plugins/3d-viewer">3D Viewer</a> does not work, please click on <span class="bc"><span>Help</span> › <span>Java3D Properties…</span></span> in the <a href="/plugins/3d-viewer">3D Viewer</a>’s menu bar.</p> <h2 id="command-line-debugging">Command line debugging</h2> <p>If this information is not enough to solve the trouble, or if <code class="language-plaintext highlighter-rouge">Test Java3D</code> did not work, then you need to call ImageJ from the command line to find out more.</p> <p>From the command line, you have several options to show more or less information about Java3D.</p> <h3 id="windows--linux">Windows &amp; Linux</h3> <p>Please find the <code class="language-plaintext highlighter-rouge">ImageJ-&lt;platform&gt;</code> executable in your ImageJ/ImageJ2/Fiji installation directory (on 32-bit Windows, that would be <code class="language-plaintext highlighter-rouge">ImageJ-win32.exe</code>. Make a copy in the same directory and rename that to <code class="language-plaintext highlighter-rouge">debug</code> (on Windows: <code class="language-plaintext highlighter-rouge">debug.exe</code>). Simply double-click that.</p> <p>On Windows, you will see a console window popping up; to copy information for pasting somewhere else, please right-click the upper-left window icon, select <em>Properties…</em>, activate the <em>Quick Edit</em> mode. Then mark the text in question by dragging the mouse with the left mouse button pressed, and copy it to the clipboard by right-clicking.</p> <p>On Linux, the output will be written to the file <code class="language-plaintext highlighter-rouge">.xsession-errors</code> in the home directory.</p> <h3 id="macos-2">macOS</h3> <p>On macOS, you need to remember that any application is just a directory with a special layout. So you can call it like this from the <em>Terminal</em> (which you will find in the Finder by clicking on <span class="bc"><span>Go</span> › <span>Utilities</span></span>. Example command line:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /Applications/ImageJ2.app/Contents/MacOS/ <span class="nb">cp </span>ImageJ-macosx debug ./debug </code></pre></div></div> <h2 id="show-java3d-debug-messages">Show Java3D debug messages</h2> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./imagej <span class="nt">-Dj3d</span>.debug<span class="o">=</span><span class="nb">true</span> <span class="nt">--</span> </code></pre></div></div> <p>(Of course, you need to substitute the <code class="language-plaintext highlighter-rouge">./imagej</code> executable name with the appropriate name for your platform.)</p> <div class="notice" style="font-size: 2; background: #e6e6e6; border-left: 10px solid #901913"><div class="notice-icon"><img src="/media/icons/note.svg" width="32" /></div><div class="notice-content"><p>Do not forget the trailing <code class="language-plaintext highlighter-rouge">--</code>; without them, ImageJ mistakes the first option for an ImageJ option rather than a Java one. And on Windows, you <em>must not</em> forget to pass the <code class="language-plaintext highlighter-rouge">--console</code> option (this can be anywhere on the command line).</p> </div> </div> <h2 id="windows-specific-stuff">Windows-specific stuff</h2> <p>On Windows, you can choose between OpenGL and Direct3D by passing <code class="language-plaintext highlighter-rouge">-Dj3d.rend=ogl</code> or <code class="language-plaintext highlighter-rouge">-Dj3d.rend=d3d</code>, respectively.</p> <p>Further, some setups require enough RAM to be reserved, so you might need to pass an option like <code class="language-plaintext highlighter-rouge">--mem=1200m</code> (make sure that you have enough RAM free before starting ImageJ that way, though!). If it turns out that memory was the issue, you can make the setting permanent by clicking ImageJ’s <span class="bc"><span>Edit</span> › <span>Options</span> › <span>Memory &amp; Threads…</span></span> menu entry.</p> <h2 id="more-java-3d-properties">More Java 3D properties</h2> <p>You can control quite a few things in Java 3D through setting Java properties. Remember, you can set properties using a command line like this:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./imagej <span class="nt">-D</span>&lt;property-name&gt;<span class="o">=</span>&lt;property-value&gt; <span class="nt">--</span> </code></pre></div></div> <p>where you substitute <code class="language-plaintext highlighter-rouge">&lt;property-name&gt;</code> and <code class="language-plaintext highlighter-rouge">&lt;property-values&gt;</code> appropriately. You can have more than one such option, but make sure that they are appearing before the <code class="language-plaintext highlighter-rouge">--</code> on the command line, otherwise ImageJ will mistake them for ImageJ options.</p> <p>This list of Java 3D properties was salvaged from the now-defunct j3d.org website:</p> <table> <thead> <tr> <th>Property</th> <th>Values</th> <th>Java 3D version</th> <th>Explanation</th> </tr> </thead> <tbody> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.rend</code></td> <td><code class="language-plaintext highlighter-rouge">ogl</code> or <code class="language-plaintext highlighter-rouge">d3d</code></td> <td>1.3.2</td> <td>Win32-only. Specifies which underlying rendering API should be used (thus allowing both Direct3D and OpenGL native DLLs to be installed on a singe machine. (default value <code class="language-plaintext highlighter-rouge">ogl</code>)</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.deviceSampleTime</code></td> <td>A time in millseconds</td> <td>1.1</td> <td>The sample time for non-blocking input devices (default value is 5ms).</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.disablecompile</code></td> <td>N/A</td> <td>1.2</td> <td>If set turns off the ability to internally .compile() the scenegraph.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.docompaction</code></td> <td>true or false</td> <td>1.3</td> <td>Default true. Controls whether or not objects are removed from the render cache when they haven’t been visibile for a while. If it is disabled, they stay in the render cache from when they are first visible until they are removed from the scene graph.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.forceReleaseView</code></td> <td>true or false</td> <td>1.3.2</td> <td>Default false. If this flag is set to true, the view is released after the Canvas3D is removed from the view. Can be used if you have memory leaks after disposing Canvas3D. Note: Setting this flag as true disables the bug fix 4267395 in View deactivate()</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.implicitAntialiasing</code></td> <td>true or false</td> <td>1.3</td> <td>Default false. By default, full scene antialiasing is disabled if a multisampling pixel format (or visual) is chosen. To honor a display drivers multisample antialiasing setting (e.g. force scene antialiasing), set the implicitAntialiasing property to true. This causes Java3D to ignore its own scene antialias settings, letting the driver implicitly implement the feature</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.optimizeForSpace</code></td> <td>true or false</td> <td>1.3</td> <td>Default true Java3d only builds display list for by-copy geometry. Set to false will cause Java3d to build display list for by-ref geometry and infrequently changing geometry using more space, but having greater speed.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.renderLock</code></td> <td>true or false</td> <td>1.3</td> <td>JDK requires getting the JAWT_DrawingSurfaceInfo and lock the surface before Java3D render on the canvas. (see comment on jdk/include/jawt.h in the SDK) Default false causes Java3D to lock the surface before rendering and unlock it afterwards for onScreen rendering in the Renderer thread. For OffScreen rendering and for front/back buffer swapping the lock will not acquired. Setting the value to true will force Java3D lock the surface using the AWT mechanism before swap() and for offScreen rendering. This may be useful for some driver/OS to workaround problem. But in general the default should work.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.threadLimit</code></td> <td>An integer</td> <td>1.2</td> <td>Controls how many threads may run in parallel regardless of how many cpu’s the system has. Setting it to “1” will make the system act like a traditional OpenGL render loop. The default value is the number of CPUs in your machine + 1.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.transparentOffScreen</code></td> <td>true or false</td> <td>1.3.2</td> <td>Default false. If this flag is set to true the background of the off screen canvas is set to transparent.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.usePbuffer</code></td> <td>true or false</td> <td>1.3.2</td> <td>Default true. If this flag is set to false pbuffer will not be use for off screen rendering.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.viewFrustumCulling</code></td> <td>true or false</td> <td>1.3.2</td> <td>Default true. If this flag is set to false, the renderer view frustum culling is turned off. Java 3D uses a 2 pass view culling. The first pass is a loose view culling of the spatial tree, and the second pass is a tight view frustum culling in the renderer before sending the geometry down to the low level graphics API. This property is to control the renderer view frustum culling, and it will not affect the first pass view culling.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">javax.media.j3d.compileStats</code></td> <td>N/A</td> <td>??</td> <td>Output scenegraph compilation statistics</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">javax.media.j3d.compileVerbose</code></td> <td>N/A</td> <td>??</td> <td>Output verbose message when compiling scenegraph</td> </tr> </tbody> </table> <h3 id="opengl-only">OpenGL only</h3> <table> <thead> <tr> <th>Property</th> <th>Values</th> <th>Java 3D version</th> <th>Explanation</th> </tr> </thead> <tbody> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.backgroundtexture</code></td> <td>true or false</td> <td>1.3</td> <td>Prior to Java3D 1.3 OGL version of Java3D used <code class="language-plaintext highlighter-rouge">glDrawPixels()</code> to render background, which is known to be very slow under Windows since most window driver did not accelerate the function. To workaround this performance problem current release uses textures for the backgrond under windows by default (<code class="language-plaintext highlighter-rouge">glDrawPixels()</code> is used as default under Solaris). Setting this flag to false will force Java3D fall back to use <code class="language-plaintext highlighter-rouge">glDrawPixels()</code> instead of texture when drawing background texture in case it provide better performance under some drivers.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.disableSeparateSpecular</code></td> <td>true or false</td> <td>1.2</td> <td>Default true enables the use of specular highlights in textures when using OpenGL 1.2.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.disableXinerama</code></td> <td>true or false</td> <td>1.3</td> <td>Solaris version only. Allows major performance boost when using dual screen environments with the X11 Xinerama extension enabled. To disable this feature you need JDK1.4. Detailed information in the release notes.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.displaylist</code></td> <td>true or false</td> <td>1.2</td> <td>Default true to use display lists (an OpenGL performance enhancing feature). False to disable for debugging.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.g2ddrawpixel</code></td> <td>true or false</td> <td>1.1</td> <td>If false, this will use texture mapping instead of glDrawPixel to flush the graphics2D to the screen. glDrawPixel is not accelerated on some older video cards (windows).</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.sharedctx</code></td> <td>true or false</td> <td>1.2</td> <td>Default true for Solaris and false for windows. Shared contexts are used in OpenGL for DisplayLists and Texture Objects to improve performance. However some drivers have bugs causing weird rendering artifacts. This can be used to disable their use to see if this is the problem.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.sharedstereozbuffer</code></td> <td>true or false</td> <td>1.2</td> <td>Some framebuffers only have one Z buffer and share this between the left and right eyes. This may be the reason why they don’t have quad buffer but can still support stereo by setting this flag to true.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.usecombiners</code></td> <td>true or false</td> <td>1.3</td> <td>Default false, uses the standard OpenGL all environment options. When set to true, it will make use of the Nvidia register combiner extensions to OpenGL for for Texture combine modes such as <code class="language-plaintext highlighter-rouge">COMBINE_INTERPOLATE</code>, <code class="language-plaintext highlighter-rouge">COMBINE_DOT3</code>. (i.e. <code class="language-plaintext highlighter-rouge">GL_NV_register_combiners</code> instead of standard OpenGL call <code class="language-plaintext highlighter-rouge">glTexEnvi(GL_TEXTURE_ENV, ...)</code>). It can be use in case like Dot3 texture when the driver does not support OpenGL extension <code class="language-plaintext highlighter-rouge">GL_ARB_texture_env_dot3/GL_EXT_texture_env_dot3</code> but it supports the <code class="language-plaintext highlighter-rouge">GL_NV_register_combiners</code> extension instead.</td> </tr> </tbody> </table> <h3 id="direct3d-only">Direct3D only</h3> <table> <thead> <tr> <th>Property</th> <th>Values</th> <th>Java 3D version</th> <th>Explanation</th> </tr> </thead> <tbody> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.d3ddevice</code></td> <td><code class="language-plaintext highlighter-rouge">emulation</code> or <code class="language-plaintext highlighter-rouge">hardware</code> or <code class="language-plaintext highlighter-rouge">tnlhardware</code> or <code class="language-plaintext highlighter-rouge">reference</code></td> <td>1.2</td> <td>Forces the software to use a particular mode for the underlying graphics accelaration. The reference option is only available if you have the Direct3D SDK installed (very unlikely).</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.d3ddriver</code></td> <td><code class="language-plaintext highlighter-rouge">idx</code></td> <td>1.2</td> <td>For cards like Voodoo that run fullscreen 3D only. idx is the order DirectX enumerates its driver using DirectDrawEnumerateEx(). This number starts at 1. This will force Java3D to use the driver specified by the user (may fail if the driver is not compatible with display). The driver number and details can be found by using the j3d.debug property. For a typical setup of a 3D only card attach to a graphics card in a single monitor system, use idx=2. This will automatically toggle to fullscreen hardware accelerated mode since if the 3D card support 3D only.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.debug</code></td> <td>true or false</td> <td>1.1</td> <td>Prints out startup and running information. Useful for finding out information about the underlying hardware setup.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.fullscreen</code></td> <td><code class="language-plaintext highlighter-rouge">PREFERRED</code> or <code class="language-plaintext highlighter-rouge">REQUIRED</code> or <code class="language-plaintext highlighter-rouge">UNNECESSARY</code></td> <td>1.2</td> <td>Option to force Java3D to run in fullscreen mode for video cards that will only use hardware accelaration when using fullscreen (non-windowed) mode, like the older Voodoo series.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.vertexbuffer</code></td> <td>true or false</td> <td>1.2</td> <td>false to turn off the use of vertex buffers (a D3D performance enhancing feature equivalent to OpenGL display lists). Some drivers have implementation problems so it might be worth turning this off if you get crashes. Utility Classes</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.audiodevice</code></td> <td>A quote string containing a class name</td> <td>1.3.2</td> <td>SimpleUniverse utility classes. Takes the name of a concrete subclass of com.sun.j3d.audioengines.AudioEngine3DL2 that will be constructed by Viewer.createAudioDevice(). The default value is null, which means that audio is disabled by default for applications that call Viewer.createAudioDevice(). j3d.configURL Unknown 1.3.1 Found in the ConfiguredUniverse class. Functionality unknown currently.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.io.ImageCompression</code></td> <td><code class="language-plaintext highlighter-rouge">None</code> or <code class="language-plaintext highlighter-rouge">GZIP</code> or <code class="language-plaintext highlighter-rouge">JPEG</code></td> <td>1.3.1</td> <td>Found in the scenegraph I/O package. Functionality unknown currently.</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">j3d.stereo</code></td> <td><code class="language-plaintext highlighter-rouge">PREFERRED</code> or <code class="language-plaintext highlighter-rouge">REQUIRED</code></td> <td>1.1</td> <td>Only used by SimpleUniverse. If you roll your own VirtualUniverse, this property is not used. Controls whether you want Java3D to definitely create stereo mode capable canvases or not</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">sun.java2d.d3d</code></td> <td>true or false</td> <td>??</td> <td>Default true. Enable Direct3D in Java 2D (not Java 3D, actually).</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">sun.java2d.ddoffscreen</code></td> <td>true or false</td> <td>??</td> <td>Default true. Enable DirectDraw and Direct3D by Java 2D for off screen images, such as the Swing back buffer (not Java 3D, actually).</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">sun.java2d.noddraw</code></td> <td>true or false</td> <td>??</td> <td>Default false. Completely disable DirectDraw and Direct3D by Java 2D (not Java 3D, actually). This avoids any problems associated with use of these APIs and their respective drivers.</td> </tr> </tbody> </table> <h1 id="interactive-debugging-using-a-shared-terminal-session">Interactive debugging using a shared Terminal session</h1> <p>For users running <a href="/platforms/linux">Linux</a> and <a href="/platforms/macos">macOS</a> computers (or on <a href="/platforms/windows">Windows</a>, <a href="http://www.cygwin.com/">Cygwin</a> with an OpenSSH server), one can use an SSH tunnel for a debugging session shared between a user and a developer. All that is needed is a shared account on a public SSH server.</p> <p>The user should execute this command:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh <span class="nt">-R</span> 2222:127.0.0.1:22 <span class="nt">-t</span> <span class="nv">$ACCOUNT</span>@<span class="nv">$SSHSERVER</span> screen </code></pre></div></div> <p>Once connected, the command</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh <span class="nt">-p</span> 2222 <span class="nv">$LOCALACCOUNT</span>@127.0.0.1 </code></pre></div></div> <p>will open a connection back to the local machine.</p> <p>The developer should then execute this command:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh <span class="nt">-t</span> <span class="nv">$ACCOUNT</span>@<span class="nv">$SSHSERVER</span> <span class="s1">'screen -x'</span> </code></pre></div></div> <p>Since this provides a shared <a href="http://savannah.gnu.org/projects/screen/">GNU screen</a> session, both the user and the developer can execute commands and see the output. It is even quite common to use the terminal window as sort of a private chat room by typing out what you have to say, ending the line with a <kbd class="key">&#8963; Ctrl</kbd> + <kbd class="key">C</kbd> (lest it get executed as a command).</p> <p>After the debugging party is over, the user can log out securely by pressing <kbd class="key">&#8963; Ctrl</kbd> + <kbd class="key">D</kbd> to log out from the local machine (since the user typed in their password in the GNU screen session herself, there is no way for the developer to log back in without the user’s explicit consent). Another <kbd class="key">&#8963; Ctrl</kbd> + <kbd class="key">D</kbd> will terminate the GNU screen session, and yet another <kbd class="key">&#8963; Ctrl</kbd> + <kbd class="key">D</kbd> will log out from the shared account on the SSH server.</p> </div> </div> </section> <!-- Footer --> <section id="footer"> <ul class="icons"> <li><a href="https://forum.image.sc/tag/imagej" class="icon alt"><img src="/media/icons/image-sc.png" width="24" style="vertical-align: middle; margin-top: -10px"><span class="label">Forum</span></a></li> <li><a href="https://twitter.com/hashtag/ImageJ" class="icon brands alt fa-twitter"><span class="label">Twitter</span></a></li> <li><a href="https://github.com/imagej" class="icon brands alt fa-github"><span class="label">GitHub</span></a></li> </ul> <ul class="copyright"> <li>Design: <a href="http://html5up.net">HTML5 UP</a></li> </ul> </section> <!-- Hamburger menu --> <nav role="navigation"> <div id="ham-toggle"> <input type="checkbox" /> <span></span> <!-- top bun --> <span></span> <!-- hamburger --> <span></span> <!-- bottom bun --> <ul id="ham-menu"> <div class="menu"><h3>ImageJ Docs</h3> <ul> <li><a href="/downloads">Download</a></li> <li><details><summary>Learn</summary><ul> <li><details><summary><a href="/learn">ImageJ Basics</a></summary><ul> <li><a href="/tutorials">Tutorials</a></li> <li><a href="/learn/user-guides">User Guides</a></li> <li><a href="/learn/keyboard-shortcuts">Keyboard Shortcuts</a></li> <li><a href="/learn/tips-and-tricks">Tips and Tricks</a></li> <li><a href="/learn/troubleshooting">Troubleshooting</a></li> <li><a href="/learn/faq">Frequently Asked Questions</a></li> <li><details><summary><a href="/platforms">Supported Platforms</a></summary><ul> <li><a href="/platforms/windows">Windows</a></li> <li><a href="/platforms/macos">MacOS</a></li> <li><a href="/platforms/linux">Linux</a></li> <li><a href="/platforms/pi">Raspberry Pi</a></li> <li><a href="/platforms/android">Android</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/Supported Platforms --> <li><details><summary><a href="/formats">File Formats</a></summary><ul> <li><a href="/formats/bio-formats">Bio-Formats</a></li> <li><a href="/formats/video">Video formats</a></li> <li><a href="/formats/quicktime">QuickTime</a></li> <li><a href="/formats/tiff">TIFF</a></li> <li><a href="/formats/pdf">PDF</a></li> <li><a href="/formats/dicom">DICOM</a></li> <li><a href="/formats/lsm">Zeiss LSM</a></li> <li><a href="/formats/olympus">Olympus VSI</a></li> <li><a href="/formats/lurawave">Opera Flex</a></li> <li><a href="/formats/fib-sem">FIB-SEM</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/File Formats --> </ul></details></li> <!-- Learn/ImageJ --> <li><details><summary><a href="/imaging">Scientific Imaging</a></summary><ul> <li><a href="/imaging/principles">Principles of Scientific Imaging</a></li> <li><a href="/imaging/annotating-images">Annotating Images</a></li> <li><a href="/imaging/colocalization-analysis">Colocalization</a></li> <li><a href="/imaging/color-image-processing">Color Image Processing</a></li> <li><a href="/imaging/deconvolution">Deconvolution</a></li> <li><a href="/imaging/image-intensity-processing">Image Intensity Processing</a></li> <li><a href="/imaging/particle-analysis">Particle Analysis</a></li> <li><a href="/imaging/registration">Registration</a></li> <li><a href="/imaging/segmentation">Segmentation</a></li> <li><a href="/imaging/stack-slice-manipulations">Stack-slice Manipulations</a></li> <li><a href="/imaging/t-functions">T-functions</a></li> <li><a href="/imaging/tracking">Tracking</a></li> <li><a href="/imaging/visualization">Visualization</a></li> <li><a href="/imaging/z-functions">Z-functions</a></li> </ul></details></li> <!-- Learn/Scientific Imaging --> </ul></details></li> <!-- Learn --> <li><details open><summary><a href="/plugins">Extend</a></summary><ul> <li><a href="/list-of-extensions">List of Extensions</a></li> <li><details><summary><a href="/update-sites">Update Sites</a></summary><ul> <li><a href="/list-of-update-sites">List of Update Sites</a></li> <li><a href="/update-sites/following">Following an Update Site</a></li> <li><a href="/update-sites/setup">Creating an Update Site</a></li> <li><a href="/update-sites/tos">Terms of Service</a></li> <li><a href="/update-sites/automatic-uploads">Automatic Upload</a></li> <li><a href="/update-sites/core-uploads">Uploading to Core Sites</a></li> <li><a href="/update-sites/faq">Update Sites FAQ</a></li> <li><a href="/update-sites/stats">Statistics</a></li> </ul></details></li> <!-- Extend/Update Sites --> <li><details><summary><a href="/scripting">Scripting</a></summary><ul> <li><a href="/scripting/basics">Scripting Basics</a></li> <li><a href="/scripting/script-editor">Script Editor</a></li> <li><a href="/scripting/parameters">Parameters</a></li> <li><a href="/scripting/user-input">User Input</a></li> <li><a href="/scripting/auto-imports">Auto Import</a></li> <li><a href="/scripting/templates">Templates</a></li> <li><a href="/scripting/batch">Batch Processing</a></li> <li><a href="/scripting/headless">Running Headlessly</a></li> <li><a href="/scripting/comparisons">Scripting Comparisons</a></li> <li><a href="/scripting/toolbox">Toolbox</a></li> <li><details><summary>Languages</summary><ul> <li><a href="/scripting/beanshell">BeanShell Scripting</a></li> <li><a href="/scripting/groovy">Groovy Scripting</a></li> <li><a href="/scripting/macro">ImageJ Macro</a></li> <li><a href="/scripting/javascript">JavaScript</a></li> <li><a href="/scripting/clojure">Lisp (Clojure)</a></li> <li><a href="/scripting/matlab">MATLAB</a></li> <li><a href="/scripting/jython">Python (Jython)</a></li> <li><a href="/scripting/python">Python (native)</a></li> <li><a href="/scripting/renjin">R (Renjin)</a></li> <li><a href="/scripting/jruby">Ruby (JRuby)</a></li> <li><a href="/scripting/scala">Scala Scripting</a></li> </ul></details></li> <!-- Extend/Scripting/Languages --> </ul></details></li> <!-- Extend/Scripting --> <li><details open><summary><a href="/develop">Development</a></summary><ul> <li><a href="/develop/philosophy">Philosophy</a></li> <li><a href="/develop/architecture">Architecture</a></li> <li><a href="/develop/source">Source code</a></li> <li><a href="/develop/project-management">Project management</a></li> <li><a href="/develop/coding-style">Coding style</a></li> <li><a href="/develop/javadoc">Using Javadoc</a></li> <li><a class="current-page">Debugging</a></li> <li><a href="/develop/wish-list">Wish list</a></li> <li><details><summary>Tools</summary><ul> <li><a href="/develop/github">GitHub</a></li> <li><a href="/develop/maven">Maven</a></li> <li><a href="/develop/ci">CI/CD</a></li> <li><a href="/develop/dotfiles">Dotfiles</a></li> <li><details><summary><a href="/develop/ides">IDEs</a></summary><ul> <li><a href="/develop/eclipse">Eclipse</a></li> <li><a href="/develop/netbeans">NetBeans</a></li> <li><a href="/develop/intellij">IntelliJ IDEA</a></li> <li><a href="/develop/command-line">Command Line</a></li> </ul></details></li> </ul></details></li> <!-- Extend/Development/Tools --> <li><details><summary>Guides</summary><ul> <li><a href="/develop/plugins">Writing plugins</a></li> <li><a href="/develop/improving-the-code">Contributing to a plugin</a></li> <li><a href="/develop/releasing">Development lifecycle</a></li> <li><a href="/develop/building-a-pom">Building a POM</a></li> <li><a href="/develop/debugging-exercises">Hands-on debugging</a></li> <li><a href="/develop/writing-ops">Adding new ops</a></li> <li><a href="/develop/formats">Adding new formats</a></li> <li><a href="/develop/native-libraries">Using native libraries</a></li> <li><a href="/develop/tips">Tips for developers</a></li> <li><a href="/develop/cpp-tips">Tips for C++ developers</a></li> <li><a href="/develop/ij1-plugins">ImageJ 1.x plugins</a></li> <li><a href="/develop/versioning">Versioning</a></li> <li><a href="/develop/logging">Logging</a></li> <li><a href="/develop/uber-jars">Uber-JARs</a></li> </ul></details></li> <!-- Extend/Development/Guides --> <li><details><summary><a href="/develop/git">Git</a></summary><ul> <li><a href="/develop/git/eclipse">Git in Eclipse (EGit)</a></li> <li><a href="/develop/git/mini-howto">Git mini howto</a></li> <li><a href="/develop/git/workshop">Git workshop</a></li> <li><a href="/develop/git/conflicts">Git conflicts</a></li> <li><a href="/develop/git/topic-branches">Git topic branches</a></li> <li><a href="/develop/git/notes">Git notes</a></li> <li><a href="/develop/git/reflogs">Git reflogs</a></li> <li><a href="/develop/git/submodules">Git submodules</a></li> <li><a href="/develop/git/pinpoint-regressions">How to pinpoint regressions</a></li> <li><a href="/develop/git/publish-a-repository">How to publish a git repository</a></li> <li><a href="/develop/git/extract-a-subproject">How to extract a subproject</a></li> </ul></details></li> <!-- Extend/Development/Git --> </ul></details></li> <!-- Extend/Development --> </ul></details></li> <!-- Extend --> <li><details><summary><a href="/contribute">Contribute</a></summary><ul> <li><a href="/contribute/citing">Citing</a></li> <li><a href="/people">Contributors</a></li> <li><a href="/orgs">Organizations</a></li> <li><a href="/contribute/governance">Governance</a></li> <li><a href="/contribute/funding">Funding</a></li> <li><a href="/contribute/fiji">Contributing to Fiji</a></li> <li><details><summary><a href="/licensing">Licensing</a></summary><ul> <li><details><summary><a href="/licensing/open-source">Open Source</a></summary><ul> <li><a href="/licensing/apache">Apache</a></li> <li><a href="/licensing/bsd">BSD</a></li> <li><a href="/licensing/epl">EPL</a></li> <li><a href="/licensing/gpl">GPL</a></li> <li><a href="/licensing/lgpl">LGPL</a></li> <li><a href="/licensing/mit">MIT</a></li> <li><a href="/licensing/public-domain">Public domain</a></li> <li><a href="/licensing/big">BIG</a></li> </ul></details></li> <!-- Contribute/Licensing/Open Source --> <li><a href="/licensing/closed-source">Proprietary</a></li> </ul></details></li> <!-- Contribute/Licensing --> <li><details><summary><a href="/editing">Editing the Wiki</a></summary><ul> <li><a href="/editing/advanced">Advanced Editing</a></li> <li><a href="/editing/buttons">Buttons</a></li> <li><a href="/editing/citations">Citations</a></li> <li><a href="/editing/code">Source Code</a></li> <li><a href="/editing/debugging">Debugging</a></li> <li><a href="/editing/headers">Headers</a></li> <li><a href="/editing/icons">Icons</a></li> <li><a href="/editing/images">Images</a></li> <li><a href="/editing/keys">Keyboard Shortcuts</a></li> <li><a href="/editing/linking">Linking</a></li> <li><a href="/editing/math">Math Expressions</a></li> <li><a href="/editing/menu-paths">Menu Paths</a></li> <li><a href="/editing/navigation">Navigation</a></li> <li><a href="/editing/notices">Notices</a></li> <li><a href="/editing/people">People</a></li> <li><a href="/editing/pitfalls">Pitfalls</a></li> <li><a href="/editing/quizzes">Quizzes</a></li> <li><a href="/editing/statbox">Statbox</a></li> <li><a href="/editing/symbols">Symbols</a></li> <li><a href="/editing/tables">Tables</a></li> <li><a href="/editing/tooltips">Tooltips</a></li> <li><a href="/editing/videos">Videos</a></li> <li><a href="/editing/whitespace">Whitespace</a></li> </ul></details></li> <!-- Contribute/Editing the Wiki --> </ul></details></li> <!-- Contribute --> <li><details><summary><a href="/discuss">Discuss</a></summary><ul> <li><a href="/discuss/bugs">Reporting Issues</a></li> <li><a href="/discuss/mailing-lists">Mailing Lists</a></li> <li><a href="/discuss/chat">Chat</a></li> </ul></details></li> <!-- Discuss --> <li><details><summary>Explore</summary><ul> <li><a href="/news">News</a></li> <li><details><summary><a href="/events">Events</a></summary><ul> <li><a href="/events/presentations">Presentations</a></li> <li><a href="/events/conferences">Conferences</a></li> <li><a href="/events/hackathons">Hackathons</a></li> <li><a href="/events">More...</a></li> </ul></details></li> <!-- Discuss/Events --> <li><details><summary><a href="/libs">Libraries</a></summary><ul> <li><a href="/libs/imagej-ops">ImageJ Ops</a></li> <li><a href="/libs/imagej-common">ImageJ Common</a></li> <li><a href="/libs/imagej-legacy">ImageJ Legacy</a></li> <li><a href="/libs/scijava">SciJava</a></li> <li><a href="/libs/scifio">SCIFIO</a></li> <li><details><summary><a href="/libs/imglib2">ImgLib2</a></summary><ul> <li><a href="/libs/imglib2/getting-started">Getting Started</a></li> <li><a href="/libs/imglib2/accessors">Accessors</a></li> <li><a href="/libs/imglib2/accessibles">Accessibles</a></li> <li><a href="/libs/imglib2/examples">Examples</a></li> <li><a href="/libs/imglib2/workshop-introductory">Introductory Workshop</a></li> <li><a href="/libs/imglib2/workshop-advanced">Advanced Workshop</a></li> <li><a href="/libs/imglib2/matlab">ImgLib2 images in MATLAB</a></li> <li><a href="/libs/imglib2/benchmarks">Benchmarks</a></li> <li><a href="/libs/imglib2/faq">FAQ</a></li> <li><a href="/libs/imglib2/developing">Developing ImgLib2</a></li> <li><a href="/libs/imglib2/discussion">ImgLib2 Discussion</a></li> </ul></details></li> <!-- Explore/Libraries/ImgLib2 --> <li><a href="/libs">More...</a></li> </ul></details></li> <!-- Explore/Libraries --> <li><details><summary><a href="/software">Software</a></summary><ul> <li><a href="/software/nih-image">NIH Image</a></li> <li><a href="/software/imagej">ImageJ</a></li> <li><a href="/software/imagej2">ImageJ2</a></li> <li><a href="/software/fiji">Fiji</a></li> <li><a href="/software">More...</a></li> </ul></details></li> <!-- Explore/Software --> </ul></details></li> <!-- Explore --> </ul> </div> </ul> </div> </nav> <div id="dock-overlay-left" class="dock-overlay" data-dock-target="left-column"></div> <div id="dock-overlay-right" class="dock-overlay" data-dock-target="right-column"></div> <!-- Search results --> <div id="search-results"> <div id="search-hits"></div> <div id="pagination"></div> </div> <!-- Scripts --> <!-- Libraries --> <script src="/assets/js/jquery.min.js"></script> <script src="/assets/js/jquery.scrolly.min.js"></script> <script src="/assets/js/browser.min.js"></script> <script src="/assets/js/breakpoints.min.js"></script> <script src="/assets/js/util.js"></script> <script src="/assets/js/jquery.toc.js"></script> <script src="/assets/js/lightbox.min.js"></script> <!-- Extensions --> <!-- Site code --> <script src="/assets/js/main.js"></script> <script src="/assets/js/dock.js"></script> <script src="/assets/js/code.js"></script> <!-- Anchors --> <script src="https://cdn.jsdelivr.net/npm/anchor-js/anchor.min.js"></script> <script>anchors.add('#page h1, #page h2, #page h3, #page h4, #page h5, #page h6');</script> <!-- Citations --> <script src="https://cdn.jsdelivr.net/npm/citation-js@0.4.0-9"></script> <script src="/assets/js/cite.js"></script> <!-- Search --> <script src="https://cdn.jsdelivr.net/npm/algoliasearch@4.13.0/dist/algoliasearch-lite.umd.js"></script> <script src="https://cdn.jsdelivr.net/npm/instantsearch.js@4.40.3/dist/instantsearch.production.min.js"></script> <script src="/assets/js/search.js"></script> <script src="/assets/js/search-tweaks.js"></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10