Hi all. I have a single-threaded FoxPro 8 DLL being instantiated and
used in a IIS ASP application. At times, the DLL will stop responding
and produce a stack overflow. I am able to catch the problem with
WinDbg and it shows me the recurring frames but I do not understand how
to proceed in order to find where in the FoxPro CODE itself the error
is occurring. I need some assistance in translating the dump into areas
in the actual code that are causing the loop. The results of !analyze
-v are below. Thanks for any help!

0:025> !analyze -v
*******************************************************************************
*
*
* Exception Analysis
*
*
*
*******************************************************************************

*************************************************************************
***
***
***
***
*** Your debugger is not using the correct symbols
***
***
***
*** In order for this command to work properly, your symbol path
***
*** must point to .pdb files that have full type information.
***
***
***
*** Certain .pdb files (such as the public OS symbols) do not
***
*** contain the required information. Contact the group that
***
*** provided you with these symbols if you need this command to
***
*** work.
***
***
***
*** Type referenced: ntdll!_PEB
***
***
***
*************************************************************************
*** WARNING: Unable to verify checksum for pdm.dll
*** ERROR: Symbol file could not be found. Defaulted to export symbols
for pdm.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols
for oledb32.dll -

FAULTING_IP:
vfp8r!EXECloseDoHistory+5d
0c0615d5 a1f8d43a0c mov eax,[vfp8r!g_punt (0c3ad4f8)]

EXCEPTION_RECORD: ffffffff -- (.exr ffffffffffffffff)
ExceptionAddress: 0c0188cf (vfp8r!_chkstk+0x00000026)
ExceptionCode: c00000fd (Stack overflow)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000000
Parameter[1]: 02172ecc

BUGCHECK_STR: c00000fd

DEFAULT_BUCKET_ID: APPLICATION_FAULT

PROCESS_NAME: DLLHOST.EXE

ERROR_CODE: (NTSTATUS) 0xc00000fd - A new guard page for the stack
cannot be created.

RECURRING_STACK: From frames 0x4 to 0xc

LAST_CONTROL_TRANSFER: from 0c2d6f38 to 0c0188cf

STACK_TEXT:
021abee0 0c2d6f38 00000000 0000001e 00000000 vfp8r!_chkstk+0x26
021abef4 0c116276 20657355 525c3a58 4f534945 vfp8r!PCProgReset+0xc4
021adfa0 0c0c869f 00000001 00000000 898fdbe3 vfp8r!macro+0xff
021adfb4 0c0615d5 00000000 039d0270 021ae058 vfp8r!x_macro+0xc
021adfd4 0c061204 0c3ab4e0 0c061776 00000001
vfp8r!EXECloseDoHistory+0x5d
021adfdc 0c061776 00000001 00000000 0c3ad560 vfp8r!imode+0x96
021ae058 0c083b7a 00000000 00000000 00000000 vfp8r!xDoStmt+0x160
021ae318 0c0839ed 0000030c 039d17d5 0c018b3d vfp8r!arrayelement+0x3e1
021ae324 0c018b3d 0000020b 0c3ad560 0000002c vfp8r!esubscript+0x17
021ae398 0c06388b 00000008 021aea10 021aeb34 vfp8r!xxexpr+0xba
021ae3b0 0c0732e6 021ae3c8 00000008 00000004 vfp8r!xxgetname+0x33
021ae5e0 0c07543c 00000000 00000014 0c3b0aa0 vfp8r!DBMObj2SpecEx+0x11f
021aebec 0c0615d5 00000045 039d16f3 021aec90 vfp8r!x_use+0x1ba
021aec0c 0c061204 0c3ab4a0 0c061776 00000000
vfp8r!EXECloseDoHistory+0x5d
021aec14 0c061776 00000000 021aee0c 00000003 vfp8r!imode+0x96
021aec90 0c0a5811 00000045 00000045 00000040 vfp8r!xDoStmt+0x160
021aed10 0c0a57a9 021aee00 00000003 00000045 vfp8r!LDCIs25Form2+0xca
021aed34 0c069583 00000045 00000002 00000000
vfp8r!LDCInvokeUserMethod+0x8c
021aee58 0c0a5380 00000002 0394518c 00000003
vfp8r!omDoMethodOrEvent+0x6d1
021af030 0c2352e7 00000002 0394518c 00000003 vfp8r!omDoMethod+0x318
021af0b4 0c2362ca 021af0f0 00000045 000002ff
vfp8r!CFoxOleObjIGetOleObject::GetOleObject+0x1a6
021af1b4 0c2364f1 03841b9c 00000001 00000000
vfp8r!CFoxOleObjIDispatchInvoke+0x2ad
021af1e8 6b614279 03841b9c 00000002 6b65c888
vfp8r!CFoxOleObjIDispatch::Invoke+0x48
021af240 0c1cc64f 0cff32e0 021af214 0c0f177a
vbscript!DllUnregisterServer+0x43
021af24c 0c0f177a 021af9a8 6b6578ce 6b658e28
vfp8r!CstSrvComMapBlindFunc+0x46
021af264 6b61866f 052c0a78 03841b9c 00000002
vfp8r!ATL::AtlInternalQueryInterface+0x63
021af988 6b62e400 00000018 021afa7c 00000000
vbscript!GlobalBinder::EnsureBuiltin+0xf60
021afa38 6b62f166 021af9a8 00000000 56433230
vbscript!CScriptRuntime::SetVar+0x13a
021afab0 6b61a3d6 00000000 00000000 00000000
vbscript!CScriptRuntime::Run+0xc83
021afaf8 6b61a251 02563960 6b607b25 02579460
vbscript!GlobalBinder::EnsureBuiltin+0x5e00
00000000 00000000 00000000 00000000 00000000
vbscript!GlobalBinder::EnsureBuiltin+0x392e


FOLLOWUP_IP:
vfp8r!EXECloseDoHistory+5d
0c0615d5 a1f8d43a0c mov eax,[vfp8r!g_punt (0c3ad4f8)]

SYMBOL_STACK_INDEX: 4

FOLLOWUP_NAME: MachineOwner

SYMBOL_NAME: vfp8r!EXECloseDoHistory+5d

MODULE_NAME: vfp8r

IMAGE_NAME: vfp8r.dll

DEBUG_FLR_IMAGE_TIMESTAMP: 3f73c232

STACK_COMMAND: .ecxr ; kb

FAILURE_BUCKET_ID: c00000fd_vfp8r!EXECloseDoHistory+5d

BUCKET_ID: c00000fd_vfp8r!EXECloseDoHistory+5d

Followup: MachineOwner
---------

Re: FoxPro Stack Overflow by Claude

Claude
Fri Mar 31 10:52:18 CST 2006

Why in the world would you use a single threaded dll with an asp page when
you could use a mtdll? My first advice would be to make it an mtdll.

ActiveVFP - Open Source VFP web development
http://www.activevfp.com
"Matthew Connor" <connah@gmail.com> wrote in message
news:1143821951.691856.179750@j33g2000cwa.googlegroups.com...
> Hi all. I have a single-threaded FoxPro 8 DLL being instantiated and
> used in a IIS ASP application. At times, the DLL will stop responding
> and produce a stack overflow. I am able to catch the problem with
> WinDbg and it shows me the recurring frames but I do not understand how
> to proceed in order to find where in the FoxPro CODE itself the error
> is occurring. I need some assistance in translating the dump into areas
> in the actual code that are causing the loop. The results of !analyze
> -v are below. Thanks for any help!
>
> 0:025> !analyze -v
> *******************************************************************************
> *
> *
> * Exception Analysis
> *
> *
> *
> *******************************************************************************
>
> *************************************************************************
> ***
> ***
> ***
> ***
> *** Your debugger is not using the correct symbols
> ***
> ***
> ***
> *** In order for this command to work properly, your symbol path
> ***
> *** must point to .pdb files that have full type information.
> ***
> ***
> ***
> *** Certain .pdb files (such as the public OS symbols) do not
> ***
> *** contain the required information. Contact the group that
> ***
> *** provided you with these symbols if you need this command to
> ***
> *** work.
> ***
> ***
> ***
> *** Type referenced: ntdll!_PEB
> ***
> ***
> ***
> *************************************************************************
> *** WARNING: Unable to verify checksum for pdm.dll
> *** ERROR: Symbol file could not be found. Defaulted to export symbols
> for pdm.dll -
> *** ERROR: Symbol file could not be found. Defaulted to export symbols
> for oledb32.dll -
>
> FAULTING_IP:
> vfp8r!EXECloseDoHistory+5d
> 0c0615d5 a1f8d43a0c mov eax,[vfp8r!g_punt (0c3ad4f8)]
>
> EXCEPTION_RECORD: ffffffff -- (.exr ffffffffffffffff)
> ExceptionAddress: 0c0188cf (vfp8r!_chkstk+0x00000026)
> ExceptionCode: c00000fd (Stack overflow)
> ExceptionFlags: 00000000
> NumberParameters: 2
> Parameter[0]: 00000000
> Parameter[1]: 02172ecc
>
> BUGCHECK_STR: c00000fd
>
> DEFAULT_BUCKET_ID: APPLICATION_FAULT
>
> PROCESS_NAME: DLLHOST.EXE
>
> ERROR_CODE: (NTSTATUS) 0xc00000fd - A new guard page for the stack
> cannot be created.
>
> RECURRING_STACK: From frames 0x4 to 0xc
>
> LAST_CONTROL_TRANSFER: from 0c2d6f38 to 0c0188cf
>
> STACK_TEXT:
> 021abee0 0c2d6f38 00000000 0000001e 00000000 vfp8r!_chkstk+0x26
> 021abef4 0c116276 20657355 525c3a58 4f534945 vfp8r!PCProgReset+0xc4
> 021adfa0 0c0c869f 00000001 00000000 898fdbe3 vfp8r!macro+0xff
> 021adfb4 0c0615d5 00000000 039d0270 021ae058 vfp8r!x_macro+0xc
> 021adfd4 0c061204 0c3ab4e0 0c061776 00000001
> vfp8r!EXECloseDoHistory+0x5d
> 021adfdc 0c061776 00000001 00000000 0c3ad560 vfp8r!imode+0x96
> 021ae058 0c083b7a 00000000 00000000 00000000 vfp8r!xDoStmt+0x160
> 021ae318 0c0839ed 0000030c 039d17d5 0c018b3d vfp8r!arrayelement+0x3e1
> 021ae324 0c018b3d 0000020b 0c3ad560 0000002c vfp8r!esubscript+0x17
> 021ae398 0c06388b 00000008 021aea10 021aeb34 vfp8r!xxexpr+0xba
> 021ae3b0 0c0732e6 021ae3c8 00000008 00000004 vfp8r!xxgetname+0x33
> 021ae5e0 0c07543c 00000000 00000014 0c3b0aa0 vfp8r!DBMObj2SpecEx+0x11f
> 021aebec 0c0615d5 00000045 039d16f3 021aec90 vfp8r!x_use+0x1ba
> 021aec0c 0c061204 0c3ab4a0 0c061776 00000000
> vfp8r!EXECloseDoHistory+0x5d
> 021aec14 0c061776 00000000 021aee0c 00000003 vfp8r!imode+0x96
> 021aec90 0c0a5811 00000045 00000045 00000040 vfp8r!xDoStmt+0x160
> 021aed10 0c0a57a9 021aee00 00000003 00000045 vfp8r!LDCIs25Form2+0xca
> 021aed34 0c069583 00000045 00000002 00000000
> vfp8r!LDCInvokeUserMethod+0x8c
> 021aee58 0c0a5380 00000002 0394518c 00000003
> vfp8r!omDoMethodOrEvent+0x6d1
> 021af030 0c2352e7 00000002 0394518c 00000003 vfp8r!omDoMethod+0x318
> 021af0b4 0c2362ca 021af0f0 00000045 000002ff
> vfp8r!CFoxOleObjIGetOleObject::GetOleObject+0x1a6
> 021af1b4 0c2364f1 03841b9c 00000001 00000000
> vfp8r!CFoxOleObjIDispatchInvoke+0x2ad
> 021af1e8 6b614279 03841b9c 00000002 6b65c888
> vfp8r!CFoxOleObjIDispatch::Invoke+0x48
> 021af240 0c1cc64f 0cff32e0 021af214 0c0f177a
> vbscript!DllUnregisterServer+0x43
> 021af24c 0c0f177a 021af9a8 6b6578ce 6b658e28
> vfp8r!CstSrvComMapBlindFunc+0x46
> 021af264 6b61866f 052c0a78 03841b9c 00000002
> vfp8r!ATL::AtlInternalQueryInterface+0x63
> 021af988 6b62e400 00000018 021afa7c 00000000
> vbscript!GlobalBinder::EnsureBuiltin+0xf60
> 021afa38 6b62f166 021af9a8 00000000 56433230
> vbscript!CScriptRuntime::SetVar+0x13a
> 021afab0 6b61a3d6 00000000 00000000 00000000
> vbscript!CScriptRuntime::Run+0xc83
> 021afaf8 6b61a251 02563960 6b607b25 02579460
> vbscript!GlobalBinder::EnsureBuiltin+0x5e00
> 00000000 00000000 00000000 00000000 00000000
> vbscript!GlobalBinder::EnsureBuiltin+0x392e
>
>
> FOLLOWUP_IP:
> vfp8r!EXECloseDoHistory+5d
> 0c0615d5 a1f8d43a0c mov eax,[vfp8r!g_punt (0c3ad4f8)]
>
> SYMBOL_STACK_INDEX: 4
>
> FOLLOWUP_NAME: MachineOwner
>
> SYMBOL_NAME: vfp8r!EXECloseDoHistory+5d
>
> MODULE_NAME: vfp8r
>
> IMAGE_NAME: vfp8r.dll
>
> DEBUG_FLR_IMAGE_TIMESTAMP: 3f73c232
>
> STACK_COMMAND: .ecxr ; kb
>
> FAILURE_BUCKET_ID: c00000fd_vfp8r!EXECloseDoHistory+5d
>
> BUCKET_ID: c00000fd_vfp8r!EXECloseDoHistory+5d
>
> Followup: MachineOwner
> ---------
>



Re: FoxPro Stack Overflow by Matthew

Matthew
Fri Mar 31 12:49:31 CST 2006

Hi Claude.

The application was written long ago before FoxPro supported
multi-threaded DLLs. As such, the application is designed to only work
with one person using it at a time. It writes to the same temp files
for certain things, etc. Yes, it is a bad design, but that's what the
situation is.

Also, if the application fails with a stack overflow on a
single-threaded DLL, I don't see how making it multi-threaded would
help. The problem is still there but now you'd just be allowing more
instances of it. :)


Re: FoxPro Stack Overflow by Claude

Claude
Fri Mar 31 13:20:25 CST 2006

I would test as an mtdll(just recompile as mtdll) if that's possible in your
case. If it works then that's the easiest solution. There are other ways to
insure single user access within an mtdll for critical processes such as :
SYS(2336,1) and SYS(2336,2) (see example at
http://www.calvinhsia.com/papers/AdvancedVFPServers.mht)

ActiveVFP - Open Source VFP web development
http://www.activevfp.com
"Matthew Connor" <connah@gmail.com> wrote in message
news:1143830971.348885.248920@i40g2000cwc.googlegroups.com...
> Hi Claude.
>
> The application was written long ago before FoxPro supported
> multi-threaded DLLs. As such, the application is designed to only work
> with one person using it at a time. It writes to the same temp files
> for certain things, etc. Yes, it is a bad design, but that's what the
> situation is.
>
> Also, if the application fails with a stack overflow on a
> single-threaded DLL, I don't see how making it multi-threaded would
> help. The problem is still there but now you'd just be allowing more
> instances of it. :)
>