簡體   English   中英

無需調試即可查找哪個匯編指令導致非法指令錯誤

[英]Find which assembly instruction caused an Illegal Instruction error without debugging

在運行我在匯編中編寫的程序時,我收到了Illegal instruction錯誤。 有沒有辦法知道哪個指令導致錯誤,沒有調試,因為我正在運行的機器沒有調試器或任何開發系統。 換句話說,我在一台機器上編譯並在另一台機器上運行。 我無法在我正在編譯的機器上測試我的程序,因為它們不支持SSE4.2。 我正在運行程序的機器確實支持SSE4.2指令。

我想這可能是因為我需要告訴匯編器(YASM)識別SSE4.2指令,就像我們使用gcc一樣傳遞-msse4.2標志。 或者你認為這不是原因嗎? 知道如何告訴YASM識別SSE4.2指令嗎?

也許我應該捕獲SIGILL信號然后解碼SA_SIGINFO以查看程序執行什么樣的非法操作。

實際上你經常得到一個非法的指令錯誤,不是因為你的程序包含非法的操作碼,而是因為你的程序中有一個錯誤(例如,緩沖區溢出)會使你的程序在一個隨機地址中跳轉到普通數據或代碼而不是操作碼的開始。

最近,由於132退出狀態代碼(128 + 4:程序被信號+非法指令信號中斷),我遇到了崩潰。 這是我如何找出導致崩潰的指令。

首先,我啟用了核心轉儲:

$ ulimit -c unlimited

有趣的是,我運行二進制文件的文件夾包含一個名為core的文件夾。 我不得不告訴Linux將PID添加到核心轉儲:

$ sudo sysctl -w kernel.core_uses_pid=1

然后我運行我的程序並得到一個名為core.23650的核心。 我用gdb加載了二進制文件和核心。

$ gdb program core.23650

進入gdb后,它顯示以下信息:

Program terminated with signal SIGILL, Illegal instruction.
#0  0x00007f58e9efd019 in ?? ()

這意味着我的程序因0x00007f58e9efd019地址內存中的非法指令而0x00007f58e9efd019 然后我切換到asm布局來檢查最后執行的指令:

(gdb) layout asm
>|0x7f58e9efd019  vpmaskmovd (%r8),%ymm15,%ymm0
 |0x7f58e9efd01e  vpmaskmovd %ymm0,%ymm15,(%rdi)
 |0x7f58e9efd023  add    $0x4,%rdi
 |0x7f58e9efd027  add    $0x0,%rdi

導致錯誤的是指令vpmaskmovd 顯然,我試圖在一個缺乏對AVX2指令集支持的系統上運行針對AVX2架構的程序。

$ cat /proc/cpuinfo | grep avx2

最后,我確認vpmaskmovd是一條AVX2指令

如果您可以在該系統上啟用核心轉儲,只需運行程序,讓它崩潰,然后將核心轉儲從目標機器上拉到您的開發機器上並將其加載到用於調試目標體系結構的GDB中 - 這應該准確地告訴您崩潰發生的地方。 只需使用GDB的core命令將核心文件加載到調試器中。

  • 要在目標上啟用核心轉儲:

     ulimit -c unlimited 
  • 控制核心文件命名方式的偽文件(請將這些文件命名為當前配置,寫入以更改配置):

     /proc/sys/kernel/core_pattern /proc/sys/kernel/core_uses_pid 

在我的系統上,一旦啟用了核心轉儲,崩潰程序將在工作目錄中編寫一個名為“core”的文件。 這可能足以滿足您的需要,但更改核心轉儲文件的命名方式可讓您保留核心轉儲的歷史記錄(如果有必要)(可能是更間歇性的問題)。

嗯...您當然可以插入跟蹤打印輸出,這樣您就可以快速排除代碼的大部分區域。 完成后,運行例如

$ objdump --disassemble my-crashing-program | less

然后跳轉到例如你知道導致錯誤的函數,並讀取代碼,尋找看起來很奇怪的東西。

我不完全確定objdump如何顯示非法指令,但它們應該脫穎而出。

對於手寫組件,我懷疑堆棧管理問題導致無法返回。 編寫一個調試打印輸出例程,保存每個寄存器並在每個函數的頂部插入一個調用。

然后你會看到你到底有多遠......

(順便說一句,一個好的編輯器和對匯編程序的宏語法的深入理解是編寫機器代碼時的救生員。)

在函數末尾缺少return語句可能會導致此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM