Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: [Caml-list] Line number for index out of bounds

594 views
Skip to first unread message

Richard Jones

unread,
Mar 6, 2006, 6:18:31 AM3/6/06
to Andries Hekstra, caml...@yquem.inria.fr
On Mon, Mar 06, 2006 at 11:44:31AM +0100, Andries Hekstra wrote:
> Invalid_argument("index out of bounds")
[...]
> Of course, I am very curious in which line number of the program this
> exception occurs.
> Is there any way to get hold of this line number?

This is a real problem with OCaml - it's impossible to get stack
traces of where an exception happens with native code. I'm assuming
you're using native code. I commonly have cases where a program dies
with "exception: Not_found" because I forgot to enclose some List.find
with an appropriate try ... with clause, or made some wrong
assumption. Tracking these down is time-consuming.

Possible workarounds:

* Use bytecode, and before running the program set the environment
variable OCAMLRUNPARAM=b which will print a stack trace.

* Surround every possible array index with a try ... with expression
like this:

try
(* code which accesses the array *)
with
Invalid_argument "index out of bounds" -> assert false

The "assert false" will print the line and character number of the
assertion.

* Hack ocamlopt to be able to print exceptions properly :-)

Rich.

--
Richard Jones, CTO Merjis Ltd.
Merjis - web marketing and technology - http://merjis.com
Team Notepad - intranets and extranets for business - http://team-notepad.com

_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Richard Jones

unread,
Mar 6, 2006, 2:55:25 PM3/6/06
to Andries Hekstra, caml...@yquem.inria.fr
On Mon, Mar 06, 2006 at 08:08:02PM +0100, Andries Hekstra wrote:
> If I would use this week of the trip to try this suggestion you made, how
> will the stack trace give me the line number?

I forgot to say that not only must you run your program in bytecode,
but you must compile your program with the '-g' option.

It will do something like this:

$ cat test.ml
let a = Array.make 10 0
let f () = a.(11)
let g = f
let h = g
let main = h ()

$ ocamlc -g test.ml -o test

$ ./test
Fatal error: exception Invalid_argument("index out of bounds")

$ OCAMLRUNPARAM=b ./test
Fatal error: exception Invalid_argument("index out of bounds")
Raised by primitive operation at unknown location
Called from file "test.ml", line 5, character 15

As you can see, often the stack backtraces aren't very accurate either :-(

You might want to look at Marcus Mottl's patch instead ...

Alan Falloon

unread,
Mar 7, 2006, 10:58:11 AM3/7/06
to Andries Hekstra, caml...@yquem.inria.fr
Andries Hekstra wrote:
> This is better than a C++ program giving a segmentation fault, as one
> now knows the reason of the crash.

> Of course, I am very curious in which line number of the program this
> exception occurs.
> Is there any way to get hold of this line number?
Maybe ocamlexc can help:
http://caml.inria.fr/pub/old_caml_site/ocamlexc/ocamlexc.htm

It statically finds uncaught exceptions in your code.

--
Alan Falloon

Martin Jambon

unread,
Mar 12, 2006, 5:22:07 AM3/12/06
to Andries Hekstra, caml...@yquem.inria.fr, Richard Jones
On Mon, 6 Mar 2006, Andries Hekstra wrote:

> Dear Richard,
>
> Thanks for your email. I indeed use native code as I need the speed. My
> program is 3500 lines, and includes multi-dimensional arrays, to putting
> try's everywhere by hand is out of the question. I would then have to
> write a metaprogram that adds such try commands to an existing OCaml
> program and outputs a longer program with the try's with the asserts. If
> possible I would like to postpone that and try your other option.

I finally finished to implement a syntax extension that I once started to
write, and gave up because of the difficulty. The result is a horribly
long syntax extension, but it should work well with strings, arrays and
bigarrays for both read and write accesses.

The syntax uses "#" instead of ".", but you can change this, if you don't
want to change your program. There is also an option which allows you to
restore the native mode. It's all there:

http://martin.jambon.free.fr/ocaml.html#bounds

I tried it on a real program of my own which uses lots of arrays: my
program runs 2-3 times slower than before, but this is due to a
short piece of code. If I use regular array accesses in
this portion of code, it works just as fast as before.

Well, that was not an easy syntax extension, but I'm satisfied with the
result.
I hope you'll like it!


Martin

> Due to this crashing business I go on a business trip to Asia without any
> ready simulation results for one week.


>
>> * Use bytecode, and before running the program set the environment
>> variable OCAMLRUNPARAM=b which will print a stack trace.
>

> If I would use this week of the trip to try this suggestion you made, how
> will the stack trace give me the line number?
>

> Best regards,
>
> Andries
>
> ------------------------------------------------------------------------
> Dr. Ir. Andries P. Hekstra
> Philips Research
> High Tech Campus 27 (WL-1-4.15)
> 5656 AG Eindhoven
> Tel./Fax/Secr. +31 40 27 42048/42566/44051
> * Good open source break software for computer users :
> http://www.workrave.org
>
>
>
>
>
>
>
>
> Richard Jones <ri...@annexia.org>
> 06-03-2006 12:14
>
> To
> Andries Hekstra/EHV/RESEARCH/PHILIPS@PHILIPS
> cc
> caml...@yquem.inria.fr
> Subject
> Re: [Caml-list] Line number for index out of bounds
> Classification


>
>
>
>
>
>
>
> On Mon, Mar 06, 2006 at 11:44:31AM +0100, Andries Hekstra wrote:

>> Invalid_argument("index out of bounds")

> [...]


>> Of course, I am very curious in which line number of the program this
>> exception occurs.
>> Is there any way to get hold of this line number?
>

> This is a real problem with OCaml - it's impossible to get stack
> traces of where an exception happens with native code. I'm assuming
> you're using native code. I commonly have cases where a program dies
> with "exception: Not_found" because I forgot to enclose some List.find
> with an appropriate try ... with clause, or made some wrong
> assumption. Tracking these down is time-consuming.
>
> Possible workarounds:
>
> * Use bytecode, and before running the program set the environment
> variable OCAMLRUNPARAM=b which will print a stack trace.
>
> * Surround every possible array index with a try ... with expression
> like this:
>
> try
> (* code which accesses the array *)
> with
> Invalid_argument "index out of bounds" -> assert false
>
> The "assert false" will print the line and character number of the
> assertion.
>
> * Hack ocamlopt to be able to print exceptions properly :-)
>

> Rich.
>
> --
> Richard Jones, CTO Merjis Ltd.
> Merjis - web marketing and technology - http://merjis.com
> Team Notepad - intranets and extranets for business -
> http://team-notepad.com
>
>

--
Martin Jambon, PhD
http://martin.jambon.free.fr

Edit http://wikiomics.org, bioinformatics wiki

Richard Jones

unread,
Mar 12, 2006, 6:04:30 AM3/12/06
to caml...@yquem.inria.fr
On Sun, Mar 12, 2006 at 02:17:37AM -0800, Martin Jambon wrote:
> The syntax uses "#" instead of ".", but you can change this, if you don't
> want to change your program. There is also an option which allows you to
> restore the native mode. It's all there:
>
> http://martin.jambon.free.fr/ocaml.html#bounds

Slightly clearer description here :-)

http://martin.jambon.free.fr/pa_bounds/README

It'd be really nice to have this as the default behaviour of array and
string accesses ... Since these are inlined, it seems like the only
penalty would be space for storing the location numbers.

Rich.

--
Richard Jones, CTO Merjis Ltd.
Merjis - web marketing and technology - http://merjis.com
Team Notepad - intranets and extranets for business - http://team-notepad.com

_______________________________________________

Message has been deleted

Christophe Papazian

unread,
Mar 14, 2006, 6:36:41 AM3/14/06
to
Why using a different syntax ? (# instead of .)
It seems to be a very useful extension !

0 new messages