我目前正在調查在arm7tdmi架構上使用gcc 4.2.1編譯的崩潰(我可以按需使用4.9.3)。我正在使用LPC2387,並且我得到了wdog重置。而不是wdog重置,我使用wdog中斷,所以當它重置,否則它會進入我的處理程序,它保存狀態並打印整個內存轉儲(僅限64k)。所以基本上我知道在wdog重置之前的寄存器,並有一個堆棧顯示所有的通話記錄。arm7tdmi大會說明+崩潰調試
在堆棧上,我可以看到大量的函數結尾的引用,並且我在內存區域看到許多指令作爲數據。我認爲這將成爲暫停和隨之而來的威脅中斷的原因。任何想法可能發生什麼?
我想理由可能是取消引用函數指針,但我的功能似乎是非常簡單的。它觸及許多硬件寄存器(中斷,外設啓用/禁用)。
像這樣:
2015年5月27日4時45分30秒:地址:4000BF2C值:7FE00390 - >這是 「svcvc 0x00e00390」 根據GCC 4.2.1和」 .word 0x7fe00390" 根據到4.9.3。
而且在函數結束時,我看到這個GCC 4.9.3
191d4: e89d6ff8 ldm sp, {r3, r4, r5, r6, r7, r8, r9, sl, fp, sp, lr}
191d8: e12fff1e bx lr
191dc: 7fe00390 .word 0x7fe00390
191e0: 40000044 .word 0x40000044
191e4: 00064de5 .word 0x00064de5
191e8: 00064dfb .word 0x00064dfb
191ec: 4000107c .word 0x4000107c
191f0: e0028000 .word 0xe0028000
191f4: e01fc000 .word 0xe01fc000
191f8: 40001084 .word 0x40001084
191fc: 4000113c .word 0x4000113c
19200: 3800b010 .word 0x3800b010
19204: 40002a78 .word 0x40002a78
19208: 40002ab4 .word 0x40002ab4
1920c: 40002aa0 .word 0x40002aa0
19210: 40001080 .word 0x40001080
19214: 400001a9 .word 0x400001a9
19218: e002c000 .word 0xe002c000
1921c: 40001134 .word 0x40001134
19220: 00064e0e .word 0x00064e0e
它曾經是這樣的GCC 4.2.1:
1953c: 7fe00390 svcvc 0x00e00390
19540: 40000044 andmi r0, r0, r4, asr #32
19544: 0006d74c andeq sp, r6, ip, asr #14
19548: 0006d764 andeq sp, r6, r4, ror #14
1954c: 400012d0 ldrmid r1, [r0], -r0
19550: e0028000 and r8, r2, r0
19554: e01fc000 ands ip, pc, r0
19558: 40001390 mulmi r0, r0, r3
1955c: 40001394 mulmi r0, r4, r3
19560: e002c040 and ip, r2, r0, asr #32
19564: 40002e54 andmi r2, r0, r4, asr lr
19568: e002c068 and ip, r2, r8, rrx
1956c: e002c000 and ip, r2, r0
19570: 40002e90 mulmi r0, r0, lr
19574: e002c02c and ip, r2, ip, lsr #32
19578: 3fffc000 svccc 0x00ffc000
1957c: 40002e7c andmi r2, r0, ip, ror lr
19580: 3fffc0a0 svccc 0x00ffc0a0
19584: 400012d4 ldrmid r1, [r0], -r4
19588: 400001a1 andmi r0, r0, r1, lsr #3
1958c: 400012d8 ldrmid r1, [r0], -r8
19590: 0006d778 andeq sp, r6, r8, ror r7
有人可以給我解釋一下什麼函數結束了嗎?什麼是.word區域?爲什麼我會在棧上看到指向這個區域的指針?
謝謝, 彼得
該結束地區將如何組織?因此,我在gcc 4.2.1下看到的svcvc指令恰好匹配模式,但它不是指令而是數據? – tothphu
是的,他們碰巧反彙編到那些指令......如果你看他們是完全荒謬的垃圾(和R0 R2,算術右移32位,然後存儲到PC?來吧...) 如果你要設置你的反彙編程序的代碼將從它運行的正確的基地址*應*認識到這些位置是數據而不是指令。 – Olipro