James,
When any of those CEExxxx errors pertaining to dynamic storage in the ILE heap occur, use the following tools and approach to assist in isolating the probable cause -- use the ILE heap debugger.
See:
https://www.ibm.com/support/pages/system/files/inline-files/i-mysterious_application-pdf.pdf
Hope that helps,
Mark S. Waterbury
On Wednesday, July 3, 2024 at 01:26:19 PM EDT, James H. H. Lampert via MIDRANGE-L <midrange-l@xxxxxxxxxxxxxxxxxx> wrote:
On 7/2/24 9:26 PM, Scott Klement wrote:
That error means that it is trying to free up memory that isn't
allocated.
. . .
What that tells me is that the pointer being passed to xdealloc() (which
is eventually being passed to the CEEFRST "Free heap storage" API of the
ILE environment) is that the pointer being passed to xdealloc either (1)
has already been freed, or (2) the pointer value has changed since it
was allocated.
. . .
I would start by removing that iconv() code -- just as a test -- to see
if it eliminates the error.
. . .
If disabling that code doesn't solve the problem, then you know that was
a red herring, and can look for other causes. In particular, it'd be
good to know what was calling xdealloc at the time the error is happening.
Well, I now know what it isn't: it isn't my usage of iconv. I switched
the code over to call your HTTP_xlatep instead, and it's still crapping
out the third time the program is called from the command line.
What's particularly odd is that the program exits with LR set. Now most
of my other applications that use HTTPAPI don't just do a single call,
and then exit. They do dozens, or even hundreds of calls. So I tried
putting the part of the application that makes the call into a do-loop,
so it would get called three times.
No change. The third time http_url_get_raw gets called, I get "CEE0810
unmonitored by HTTPAPIR4 . . . ."
Taking out the loop, and doing a RCLRSC between calls to my program, the
same results.
FWIW, I *never* call XDEALLOC directly. As with all my past HTTPAPI
applications, I use a global large static variable as my buffer:
D DS
D BUFFY 1 500000A
D BUFFA 1 500000A DIM(500000)
and a very simple buffer-filling procedure.
**** Breakthrough! ****
I didn't even *think* to call the application again after it had blown
up, instead of signing off and signing back on. I just did so, expecting
it to simply blow up again. It didn't. Instead, it gave me a repeating
pattern of two good web service calls, and a CEE0810. Over and over again.
Is there maybe something I should look for in the http_debug.txt? All I
see is that a failed call is 202 lines, ending with
SetError() #13: HTTP/1.1 200 OK
recvresp(): end with 200
recvdoc parms: identity 3022
but a successful one is 208 lines, ending with
SetError() #13: HTTP/1.1 200 OK
recvresp(): end with 200
recvdoc parms: identity 3022
header_load_cookies() entered
recvdoc(): entered
SetError() #0:
{ "results" : [ . . .
http_close(): entered
I do note that the additional lines at the end only account for 5 of the
6 additional lines. I wonder where the other line is . . .
I probably need to knock off the active testing of this application for
today: the web service I'm calling is the Google Geocoding service,
"maps.googleapis.com/maps/api/geocode/json?address= . . . ," and we only
get a finite number of calls per day on our key.
--
JHHL
As an Amazon Associate we earn from qualifying purchases.