[PATCH 01/12] [Winedump]: added ability to dump FPO debug information

Eric Pouech eric.pouech at wanadoo.fr
Fri Jan 5 14:42:12 CST 2007




A+
---

 tools/winedump/debug.c |   29 +++++++++++++++++++++++++++--
 1 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/tools/winedump/debug.c b/tools/winedump/debug.c
index 4ce09c8..747644d 100644
--- a/tools/winedump/debug.c
+++ b/tools/winedump/debug.c
@@ -578,8 +578,33 @@ void	dump_codeview(unsigned long base, u
 
 void	dump_frame_pointer_omission(unsigned long base, unsigned long len)
 {
-	/* FPO is used to describe nonstandard stack frames */
-	printf("FIXME: FPO (frame pointer omission) debug symbol dumping not implemented yet.\n");
+    const FPO_DATA*     fpo;
+    const FPO_DATA*     last;
+    const char*         x;
+    /* FPO is used to describe nonstandard stack frames */
+    printf("Range             #loc #pmt Prlg #reg Info\n"
+           "-----------------+----+----+----+----+------------\n");
+    
+    fpo = (const FPO_DATA*)PRD(base, len);
+    if (!fpo) {printf("Couldn't get FPO blob\n"); return;}
+    last = (const FPO_DATA*)((const char*)fpo + len);
+
+    while (fpo < last && fpo->ulOffStart)
+    {
+        switch (fpo->cbFrame)
+        {
+        case FRAME_FPO: x = "FRAME_FPO"; break;
+        case FRAME_NONFPO: x = "FRAME_NONFPO"; break;
+        case FRAME_TRAP: x = "FRAME_TRAP"; break;
+        case FRAME_TSS: x = "case FRAME_TSS"; break;
+        default: x = NULL; break;
+        }
+        printf("%08x-%08x %4u %4u %4u %4u %s%s%s\n", 
+               fpo->ulOffStart, fpo->ulOffStart + fpo->cbProcSize,
+               fpo->cdwLocals, fpo->cdwParams, fpo->cbProlog, fpo->cbRegs,
+               x, fpo->fHasSEH ? " SEH" : "", fpo->fUseBP ? " UseBP" : "");
+        fpo++;
+    }
 }
 
 struct stab_nlist



More information about the wine-patches mailing list