As I wrote in {$R+} mode and at compile time the compiler will show you where that stack overflow occurs, provided line info is also on.
He got a line, posted in the gdb frame info earlier:
eip = 0x415830 in PARSEASMPARAM (src/uUtil.pas:47); saved eip 0x414ede
If his posted units are complete and unmodified, then that is a "begin" of a procedure.
In the begin line, the "frame" gets initialized. And the code might allocate stack by modifying the stackpointer.
It would then be good to know the exact definition of all the types (params and result):
function ParseASMParam(const AParam: String; const acceptableTypes: TParamTypes; var AInterfaceData: TInterfaceDataArr): TByteArray;
Maybe one of them adds lots of stack memory usage. (Though assuming they are sets and dyn array, that isn't likely)
I can't tell if the code can recurse... It does not look like that in the posted code. But There is no indication what TInterfaceData does....
Looking at how many calling frames there are, may also help.
And if nothing comes up from that, maybe the asm of the begin line...
Also not sure if I misread gdb output, or if there is something:
(gdb) x/x $esp
0x432a70: 0x00000000
(gdb) info frame
Stack level 0, frame at 0x142fa78:
eip = 0x415830 in PARSEASMPARAM (src/uUtil.pas:47); saved eip 0x414ede
If the value of esp is 0x432a70 => then haw can the frame be at 0x142fa78
Well the frame would be in the basepointer ebp. But that is a copy of the esp, before the size of the frame is added to the esp.
Then if esp is so far off, something went wrong.
Hence maybe the asm (and values of involved registers). The code in front of the eip 0x415830 should be changing the esp.
I just can't see why it would allocate that much. (hence maybe the definition of the params).