TweetFollow Us on Twitter

Fortran Debugging
Volume Number:9
Issue Number:3
Column Tag:Jörg's Folder

LS Tools for FORTRAN Debugging

The easy way to avoid those bugs that make you feel foolish.

By Jörg Langowski, MacTech Magazine Regular Contributing Author

Whoever has written a more or less complicated program (and you probably wouldn’t be reading this if you hadn’t) knows that the hardest bug to find is always the next-to last (you won’t find the last one, of course). I’m using Fortran for most of my programming (and even dare to admit that): it is nice to be able to use math libraries and other existing code and put that directly on the Macintosh. But whenever I sit for days over a piece of code and just don’t see why it won’t work, only to find out that I had mixed up the order of parameters or their types in some obscure subroutine call, I start hating programming in general and Fortran in particular. In C++ types are checked: if you try to pass an integer for a real, the compiler will complain. If I only had the time to recode all my stuff into C++, I’d probably do so.

But at the moment, I’m working a lot with Fortran, like many of my colleagues. So we’d better have some good debugging aids that save us time. Language Systems has just presented a series of such tools, which I’d like to tell you about.

FLint

A typical error in languages which don’t have type checking is to pass a parameter of a wrong type to a subroutine. Look at the following example:

 program calls
 
 real*8 x
 real*8 b(50,50)
 integer n
 character*40 c
 
 call sub_a (x, b, n, c)
 write (*,*) ((b(i,j),i=1,5),j=10,15)
 
 call sub_a (b, n, x, c)
 write (*,*) ((b(i,j),i=1,5),j=10,15)
 
 end
 
 subroutine sub_a(x, b, n, c)
 
 real*8 x
 real*4 b(50,50)
 integer n

 character*40 c

 do i=1,50
 do j=1,50
 b(i,j) = i + 0.01*j
 end do
 end do
 
 return
 end

where the subroutine sub_a, which writes into the array b, is called twice from a main program. Both calls are wrong: in the first case, an array of the wrong type is passed (real*4 instead of real*8), and on the second call, the order of the parameters is completely mixed up. Of course, the output values, after the calls to sub_a, will be totally wrong.

The example is trivial, and the error in this case would be rather easy to catch. The program even ran on my machine without complaints, even though the subroutine will write half the values for b into no-man’s land, the array passed being only half as big as it should be. However, errors of this kind do happen often enough, and will be much harder to catch in a complex program than in the isolated example given here.

The interesting thing is that the compiler swallows the code without any error or warning messages. It would be nice to have a tool which will indicate if a subroutine has been called with the wrong number or type of arguments.

LSFlint, contained in the debugging toolkit for LS Fortran distributed by Language Systems, does this kind of type checking, and a lot of other things. It runs under the MPW shell; for testing the example above (in file calls.f), you might type

LSFlint calls.f

and you’ll get this output:

      call sub_a (b, n, x, c)
### lsflint - Warning - SUB_A arg   2:N, possible size discrepancy exists
### lsflint - Warning - SUB_A arg   2:N, possible type discrepancy exists
### lsflint - Warning - SUB_A arg   3:X, possible size discrepancy exists
### lsflint - Warning - SUB_A arg   3:X, possible type discrepancy exists
    File "calls.f"; Line 11
#------------------------------------------------------------
    File "calls.f"; Line 8 # earlier usage
#------------------------------------------------------------

      subroutine sub_a(x, b, n, c)
### lsflint - Warning - SUB_A arg   2:B, possible size discrepancy exists
### lsflint - Warning - SUB_A arg   2:B, possible type discrepancy exists
    File "calls.f"; Line 16
#------------------------------------------------------------
    File "calls.f"; Line 8 # earlier usage
#------------------------------------------------------------

Of course, LSFlint includes complete syntax checking, you’ll get the same syntax error messages as the compiler would give you for wrong code. It works at almost the same speed as the compiler: in my test it took 7 minutes for checking a program of a total of 4355 lines of code, while the compiler (at opt=3) took 5:30 minutes. However, in that case it created pages of warning messages (that was on a program that ran correctly!): about variables that had been declared but never used, about possible problems with passing pointers to matrices in subroutine calls, and even about some places where I had called a subroutine with the wrong number of parameters! It is actually amazing that that program gave the correct answers. This will give me now some opportunity to really ‘lint out’ that code, which is what LSFlint is all about.

An obvious area of application for LSFlint is for those who use Macintosh system calls from Fortran. You can easily make a mistake about which parameters have to be passed by value, by reference, and which are 16 or 32 bits long. All those errors will be caught by LSFlint.

Finally, if you are still using common blocks in your code (which I think is an ugly practice, especially since LS Fortran now allows named global variables), the program will detect differences in the size of common blocks and other discrepancies between routines. Also, when structures are passed to subroutines it will not only be checked whether the size and type of the elements matched, but whether the structure actually has the correct name. All in all, a very useful tool for improving Fortran code (one must mention that Lint, a similar utility for C code, has been available on the Unix scene from various sources for a long time). Still, you have to write your own code.

DebugLib

The second tool included in the LS debugging toolkit is DebugLib, a debugging library. By linking your code with DebugLib.o (it contains routines which override some of those in FORTRANLib.o), you will have interactive control over the various debugging options that Language Systems Fortran offers: until now, you would have had to recompile the program for changing those options. Now, when you have compiled a program with -debug=3 -r -ov and linked with the debugging library, a dialog appears when you execute the program that allows you to set the debugging options interactively:

Figure 1

Each time the dialog comes up, it tells you where you are in the program (top two lines), and lets you check the debugging options. The last option is especially useful; it will let the program pause (and redisplay this dialog) on each subroutine entry, when you hold down the caps lock key. Thus, by releasing the caps lock key you may accelerate your program while it is executing uncritical sections of code. There is also an option that tries to recover from stack overflow errors by increasing the stack space; this can be important if you use lots of local variables that take up space on the stack on every subroutine call. The other options should be evident; you know already the trace window from earlier versions of LS Fortran (it displays continuously the line and routine name where the program is executing).

SourceBug

Finally, the debugging toolkit contains a copy of Apple’s SourceBug, an interactive source code debugger that is much easier to use (though less powerful) than the SADE debugger. It needs a symbol file that the compiler and linker create from your application; for LS Fortran, you use the -sym option for the compiler and the -sym on option for the linker. You then open up SourceBug, and use the Open command from its File menu to start up your application. SourceBug will then open the ‘program browser’ which contains a list of all the source files that make up your program and for each source file all its routines.

You can set breakpoints in your program simply by choosing a routine with the two lists on top, and then click next to the program line where you want to have the breakpoint. Of course, SADE would give you much better control, for instance you can have conditional breakpoints; but SourceBug is very straightforward to use and needs no long setting up, like SADE.

Figure 2

You start your application by selecting ‘Run’ from a Control menu. When the program then hits the breakpoint, a second browser will come up, the ‘stack crawl’ window, which shows the routine where the break occurred and the calling sequence starting with the main program:

Figure 3

Here, you may now inspect the values of all variables simply by selecting them with the mouse and selecting ‘Evaluate’. I should say that you may find some difficulties here when you select big arrays to display; it takes forever to refresh the window which displays its values. But for simple variables or smaller arrays, it works just fine.

Other goodies

There has been more information on my desk about new Products that run with Fortran. Two tools, also available through Language Systems for some time now, are a plotting library called SuperPlot and a ‘code structurer’ that converts spaghetti code into nicely stratified lasagna. A review of these two utilities is long overdue, and I’ll try to put it into this column before long. But until then, we should also hear again about C++ and Forth.

MacForth people, please take note that we are desperately looking for good examples written for MacForth - we’d like to cover the only commercial Forth product for the Macintosh a little more than we have usually been doing (which should not be difficult).

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Latest Forum Discussions

See All

Make the passage of time your plaything...
While some of us are still waiting for a chance to get our hands on Ash Prime - yes, don’t remind me I could currently buy him this month I’m barely hanging on - Digital Extremes has announced its next anticipated Prime Form for Warframe. Starting... | Read more »
If you can find it and fit through the d...
The holy trinity of amazing company names have come together, to release their equally amazing and adorable mobile game, Hamster Inn. Published by HyperBeard Games, and co-developed by Mum Not Proud and Little Sasquatch Studios, it's time to... | Read more »
Amikin Survival opens for pre-orders on...
Join me on the wonderful trip down the inspiration rabbit hole; much as Palworld seemingly “borrowed” many aspects from the hit Pokemon franchise, it is time for the heavily armed animal survival to also spawn some illegitimate children as Helio... | Read more »
PUBG Mobile teams up with global phenome...
Since launching in 2019, SpyxFamily has exploded to damn near catastrophic popularity, so it was only a matter of time before a mobile game snapped up a collaboration. Enter PUBG Mobile. Until May 12th, players will be able to collect a host of... | Read more »
Embark into the frozen tundra of certain...
Chucklefish, developers of hit action-adventure sandbox game Starbound and owner of one of the cutest logos in gaming, has released their roguelike deck-builder Wildfrost. Created alongside developers Gaziter and Deadpan Games, Wildfrost will... | Read more »
MoreFun Studios has announced Season 4,...
Tension has escalated in the ever-volatile world of Arena Breakout, as your old pal Randall Fisher and bosses Fred and Perrero continue to lob insults and explosives at each other, bringing us to a new phase of warfare. Season 4, Into The Fog of... | Read more »
Top Mobile Game Discounts
Every day, we pick out a curated list of the best mobile discounts on the App Store and post them here. This list won't be comprehensive, but it every game on it is recommended. Feel free to check out the coverage we did on them in the links below... | Read more »
Marvel Future Fight celebrates nine year...
Announced alongside an advertising image I can only assume was aimed squarely at myself with the prominent Deadpool and Odin featured on it, Netmarble has revealed their celebrations for the 9th anniversary of Marvel Future Fight. The Countdown... | Read more »
HoYoFair 2024 prepares to showcase over...
To say Genshin Impact took the world by storm when it was released would be an understatement. However, I think the most surprising part of the launch was just how much further it went than gaming. There have been concerts, art shows, massive... | Read more »
Explore some of BBCs' most iconic s...
Despite your personal opinion on the BBC at a managerial level, it is undeniable that it has overseen some fantastic British shows in the past, and now thanks to a partnership with Roblox, players will be able to interact with some of these... | Read more »

Price Scanner via MacPrices.net

You can save $300-$480 on a 14-inch M3 Pro/Ma...
Apple has 14″ M3 Pro and M3 Max MacBook Pros in stock today and available, Certified Refurbished, starting at $1699 and ranging up to $480 off MSRP. Each model features a new outer case, shipping is... Read more
24-inch M1 iMacs available at Apple starting...
Apple has clearance M1 iMacs available in their Certified Refurbished store starting at $1049 and ranging up to $300 off original MSRP. Each iMac is in like-new condition and comes with Apple’s... Read more
Walmart continues to offer $699 13-inch M1 Ma...
Walmart continues to offer new Apple 13″ M1 MacBook Airs (8GB RAM, 256GB SSD) online for $699, $300 off original MSRP, in Space Gray, Silver, and Gold colors. These are new MacBook for sale by... Read more
B&H has 13-inch M2 MacBook Airs with 16GB...
B&H Photo has 13″ MacBook Airs with M2 CPUs, 16GB of memory, and 256GB of storage in stock and on sale for $1099, $100 off Apple’s MSRP for this configuration. Free 1-2 day delivery is available... Read more
14-inch M3 MacBook Pro with 16GB of RAM avail...
Apple has the 14″ M3 MacBook Pro with 16GB of RAM and 1TB of storage, Certified Refurbished, available for $300 off MSRP. Each MacBook Pro features a new outer case, shipping is free, and an Apple 1-... Read more
Apple M2 Mac minis on sale for up to $150 off...
Amazon has Apple’s M2-powered Mac minis in stock and on sale for $100-$150 off MSRP, each including free delivery: – Mac mini M2/256GB SSD: $499, save $100 – Mac mini M2/512GB SSD: $699, save $100 –... Read more
Amazon is offering a $200 discount on 14-inch...
Amazon has 14-inch M3 MacBook Pros in stock and on sale for $200 off MSRP. Shipping is free. Note that Amazon’s stock tends to come and go: – 14″ M3 MacBook Pro (8GB RAM/512GB SSD): $1399.99, $200... Read more
Sunday Sale: 13-inch M3 MacBook Air for $999,...
Several Apple retailers have the new 13″ MacBook Air with an M3 CPU in stock and on sale today for only $999 in Midnight. These are the lowest prices currently available for new 13″ M3 MacBook Airs... Read more
Multiple Apple retailers are offering 13-inch...
Several Apple retailers have 13″ MacBook Airs with M2 CPUs in stock and on sale this weekend starting at only $849 in Space Gray, Silver, Starlight, and Midnight colors. These are the lowest prices... Read more
Roundup of Verizon’s April Apple iPhone Promo...
Verizon is offering a number of iPhone deals for the month of April. Switch, and open a new of service, and you can qualify for a free iPhone 15 or heavy monthly discounts on other models: – 128GB... Read more

Jobs Board

IN6728 Optometrist- *Apple* Valley, CA- Tar...
Date: Apr 9, 2024 Brand: Target Optical Location: Apple Valley, CA, US, 92308 **Requisition ID:** 824398 At Target Optical, we help people see and look great - and Read more
Medical Assistant - Orthopedics *Apple* Hil...
Medical Assistant - Orthopedics Apple Hill York Location: WellSpan Medical Group, York, PA Schedule: Full Time Sign-On Bonus Eligible Remote/Hybrid Regular Apply Now Read more
*Apple* Systems Administrator - JAMF - Activ...
…**Public Trust/Other Required:** None **Job Family:** Systems Administration **Skills:** Apple Platforms,Computer Servers,Jamf Pro **Experience:** 3 + years of Read more
Liquor Stock Clerk - S. *Apple* St. - Idaho...
Liquor Stock Clerk - S. Apple St. Boise Posting Begin Date: 2023/10/10 Posting End Date: 2024/10/14 Category: Retail Sub Category: Customer Service Work Type: Part Read more
Top Secret *Apple* System Admin - Insight G...
Job Description Day to Day: * Configure and maintain the client's Apple Device Management (ADM) solution. The current solution is JAMF supporting 250-500 end points, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.