2015-05-27 52 views
0

我目前正在調查在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區域?爲什麼我會在棧上看到指向這個區域的指針?

謝謝, 彼得

回答

1

功能塊的端部後的字節是通常數據。

例如如果我有void *somePtr = 0xABCDEF12;那麼你通常會得到一個LDR指令,將該值存入一個寄存器,並且假設小端操作,你會看到十六進制的序列12 EF CD AB

+0

該結束地區將如何組織?因此,我在gcc 4.2.1下看到的svcvc指令恰好匹配模式,但它不是指令而是數據? – tothphu

+0

是的,他們碰巧反彙編到那些指令......如果你看他們是完全荒謬的垃圾(和R0 R2,算術右移32位,然後存儲到PC?來吧...) 如果你要設置你的反彙編程序的代碼將從它運行的正確的基地址*應*認識到這些位置是數據而不是指令。 – Olipro