php報錯bus(Php報錯連接已重置的解決辦法)

本文目錄一覽:

關於PHP的三目運算,究竟是怎樣的?

你可以吧你的代碼精簡下,比如如下:

?php 

$arg = ‘B’;

$vehicle =(( $arg == ‘B’ ) ? ‘bus’ : ( $arg == ‘A’ )) ? ‘airplane’ :  ‘feet’;

echo $vehicle;

這樣看就很明顯了,先執行括弧中的三目運算。

如何解決bus error

一,Bus Error究竟是指什麼

Bus Error,即匯流排錯誤。

引發原因:

CPU處於性能方面的考慮,要求對數據進行訪問時都必須是地址對齊的。如果發現進行的不是地址對齊的訪問,就會發送SIGBUS信號給進程,使進程產生 core dump。RISC包括SPARC(一種微處理器架構)都是這種類型的晶元。x86系列CPU都支持不對齊訪問,也提供了開關禁用這個機制。x86架構不要求對齊訪問的時候,必定會有性能代價。例如,對int的訪問應該是4位元組對齊的,即地址應該是4的倍數,對short則是2位元組對齊的,地址應該是2的倍數。

Bus Error也有可能是因為機器物理問題或者訪問無效物理地址,但這種情況非常少見。

Linux平台上執行malloc(),如果沒有足夠的RAM,Linux不是讓malloc()失敗返回,而是向當前進程分發SIGBUS信號。

注: 對該點執懷疑態度,有機會可自行測試確認當前系統反應。

SIGBUS與SIGSEGV信號的一般區別如下:

1) SIGBUS(Bus error)意味著指針所對應的地址是有效地址,但匯流排不能正常使用該指針。通常是未對齊的數據訪問所致。

2) SIGSEGV(Segment fault)意味著指針所對應的地址是無效地址,沒有物理內存對應該地址。

二,例子程序:

1 int main(){

2

3

4

5

6 #if defined(__GNUC__)

7 # if defined(__i386__)

8

9 __asm__(“pushf/norl $0x40000,(%esp)/npopf”);

10 # elif defined(__x86_64__)

11

12 __asm__(“pushf/norl $0x40000,(%rsp)/npopf”);

13 # endif

14 #endif

15

16

17

18

19

20

21

22

23

24 short array[16];

25

26 int * p = (int *) array[1];

27 *p = 1;

28

29 return 1;

30 }

short類型大小為2個位元組,其地址必是2的倍數。而對於int指針來說,能夠使用以訪問數據的地址應該是4的倍數,轉化arrary[1]的地址為int *並訪問,系統會發出SIGBUS信號,導致程序崩潰。

wiki上的例子:

#include stdlib.h

int main( int argc, char ** argv) {

int * iptr;

char * cptr;

#if defined(__GNUC__)

# if defined(__i386__)

__asm__( “pushf/n orl $0x40000,(%esp)/n popf” ) ;

# elif defined(__x86_64__)

__asm__( “pushf/n orl $0x40000,(%rsp)/n popf” ) ;

# endif

#endif

cptr = malloc( sizeof ( int ) + 1) ;

iptr = ( int * ) ++ cptr;

* iptr = 42 ;

return 0 ;

}

$ gcc -ansi sigbus.c -o sigbus

$ ./sigbus

Bus error

$ gdb ./sigbus

(gdb) r

Program received signal SIGBUS , Bus error.

0x080483ba in main ()

(gdb) x/i $pc

0x80483ba main+54: mov DWORD PTR [eax],0x2a

(gdb) p/x $eax

$1 = 0x804a009

(gdb) p/t $eax (sizeof(int) – 1)

$2 = 1

三,編譯器和硬體平台相關性

上述已經描述,對於x86平台,默認允許非對齊訪問,只不過會有性能代價。開啟檢測可以使用上述代碼中的宏。

這段程序如果用Sun Studio編譯器的話,運行就沒有問題。這是因為Sun Studio默認對32位編譯使用的參數是-xmemalign=8i,其中i選項設置明確指明不產生SIGBUS信號。

不過如果編譯成64位程序,Sun Studio使用的-xmemalign=8s,其中s選項設置意味對這種非對齊訪問產生SIGBUS信號,則仍舊會遇到這個錯誤。

如果堅持在SPARC上使用GCC去編譯這種代碼,可以如下進行:

GCC有一個Type Attributes特性,例如在需人工對齊的變數後加上:__attribute__ ((aligned (4))); 其意義就是指定偏移量為4的倍數。比如:

short array[10] __attribute__ ((aligned (4)));

不過這個屬性只對Linker連接器可見的變數有效,也就是說對local variable無效。而且這種特性作用粒度比較大,比如這裡只對第一個元素有作用,並不為數組的每個成員設置偏移量。如果一定要針對local variable或者數組的每個成員進行偏移量設置,可以使用union類型:

union {

short s;

int i;

}

liunx下怎麼裝mysql出現bus error

Linux下不使用dll形式,你需要安裝php_mysql,如果是Redhat系列的話就用yum installl php_mysql,如果是Debian系列的話就用apt-get來安裝

php列表查詢 有選擇性的綁定數據集,輸出動態表格,結果資料庫里的內容全部輸出,沒有經過篩選,怎麼回事?

bus.design 多了個” 還有where bus.design=%s要換成where bus.disign=a.b這種形式的

Linux下iconv bus error該如何解決

bus error 是匯流排錯誤,這個錯誤一般是程序無法有效兼容當前 CPU 的工作而報錯。

這隻能刪了這個軟體重新裝。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238336.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:10
下一篇 2024-12-12 12:10

相關推薦

發表回復

登錄後才能評論