如何調試一個C程序,該程序在與gdb中的gdb
和run
連接時不會崩潰?C malloc「不能分配區域」錯誤,但不能用GDB重新生成?
獨立運行時會一直崩潰 - 即使是相同的調試版本!
我們幾個都收到此錯誤與BSD/Linux編寫的C程序,我們正在編制上與OpenSSL的Mac系統。
app(37457,0x7000017c7000) malloc: *** mach_vm_map(size=13835058055282167808) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
ERROR: malloc(buf->length + 1) failed!
我知道,沒有幫助。
重新編譯應用程序-g -rdynamic
給出了相同的錯誤。好吧,現在我們知道這不是因爲發佈版本,因爲它繼續失敗。
雖然在gdb
調試會話中運行,但它工作!
$ sudo gdb app
(gdb) b malloc_error_break
Function "malloc_error_break" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (malloc_error_break) pending.
(gdb) run -threads 8
Starting program: ~/code/app/app -threads 8
[New Thread 0x1903 of process 45436]
warning: unhandled dyld version (15)
它運行幾個小時。 CTRL-C,然後運行./app -threads 8
,並在第二次或兩次(幾百萬次迭代)後崩潰。
很明顯,其中一個線程存在問題。但這些線程的工作人員非常大(幾百行代碼)。沒有什麼突出的。
請注意,線程迭代每秒約2000萬的循環。
- MACOS 10.12.3
- 自制瓦特/ GNU GCC和OpenSSL(鏈接到加密)
PS,不熟悉C太多 - 尤其是任何類型的調試。善良,表達/詳細的答案。 :)
這肯定看起來很可疑:'mach_vm_map(size = 13835058055282167808)'對我來說,'buf-> length'未初始化或損壞。考慮到它是一個多線程的過程,我會先仔細查看線程之間的所有共享變量/內存並仔細檢查,確保正確的鎖定/同步。總的來說,這聽起來像一個典型的競爭條件在這種情況下,外部工具往往沒有幫助,因爲它們放慢了程序足以隱藏問題。 –
我會嘗試valgrind,在做其他事情之前...... – m8mble