I would like to use the --trap_on_deopt flag ("put a break point before deoptimizing") because it sounds like a way to pause the program in a debugger, inspect the local variables and hopefully understand why a function has been deoptimised. Unfortunately I cannot find any examples on the web of how this flag is used.
I had naively assumed it would just set a breakpoint when and where a function was deoptimised and invoke the debugger. Jakob and Yang have explained to me that it throws a SIGTRAP signal that needs to be caught (see link below). Unfortunately even with this knowledge I still cannot work out how to use this flag. All of the following commands result in "d8.exe has stopped working" without d8 printing anything:
[d8 3.17.11, built with Visual Studio 2010, Windows 7 x64]
d8 --trap_on_deopt
d8 --debugger --trap_on_deopt
d8 --trap_on_deopt test.js
d8 --debugger --trap_on_deopt test.js
d8 fails immediately even when it hasn't been passed a js file. d8 runs as expected when --trap_on_deopt is omitted.
I have had more success with Node.js:
[node-v0.10.0-x86.msi]
node --trace_deopt --trap_on_deopt test.js
The script will run up to the deopt but then quits to the OS, ignoring several nested catch...finally statements. Including the debug option yields:
node --trace_deopt --trap_on_deopt debug test.js
[deoptimize context: 671033d]
< debugger listening on port 5858
connecting... ok
break in test.js:1
before Node quits to the OS without running any of the script. Node runs as expected when --trap_on_deopt is omitted.
I had assumed that this behaviour and the absence of any examples on the web indicated an underused and buggy feature but apparently not (
http://code.google.com/p/v8/issues/detail?id=2583&thanks=2583&ts=1363468366). If the exception is thrown by d8/Node to the OS, and not to my catches or the debugger, then I'm really confused about what this flag does and how it can be used properly.
I would be grateful if someone could provide an example of how to use --trap_on_deopt.