Ⅰ C語言編譯器icc與gcc編譯出來的執行文件有什麼區別
ICC 是intel 針對intel 體系架構開發的編譯器,顯然,你的代碼,如果運行在intel機器上,intel的人開發的編譯器,編譯出來的可執行代碼效率更高。畢竟人家對intel體系結構這么熟悉,裡面的優化說明的,肯定做得不錯。但是只能運行在intel體系結構上。比如你的PPC的板子就不能運行了。
GCC是一般性的通用的編譯器,可以編譯運行在各種體系結構上的代碼,比如intel, PPC, ARM, MIPS。它很通用。裡面的開發者,當然也熟悉intel 體系架構。但是也要考慮到通用。所以,是一般化的選擇。在intel體系結構上運行的話,可能某些地方不如ICC的效率高。
他們實現的原理基本是一致的,但是在細節上,肯定差別很大。比如針對同一種語句,有的會告警,有的不會。有些支持擴展特性。有些不支持。
Ⅱ 編譯這樣的告警怎麼消除掉
樓主這是什麼工具?這個是編譯告警還是運行時候的告警?
從字面來看是
1、第一個告警是隱式定義系統山飢告函數strcmp,這個肢敬包含逗明一下頭文件就可以了。具體參照二樓的包含string.h,如果樓主是windows操作系統的話,有個最全的頭文件windows.h,直接包含進來省事了。
#include <windows.h>或者
#include <string.h>
2、第二個告警是隱式類型轉換,int(整數)到unsigned int(無符號整數)會導致精確度丟失。strlen返回的是字元串的長度,長度不會是負數,所以一定是無符號的。樓主的len定時成unsigned int就行了。
int len改成
unsigned int len就行了。
或者
len = (int)strlen(codeb);顯示的強制類型轉換。
樓主的編譯器很嚴格,一般編譯器對這種告警都是忽略的。樓主忽略也可。
Ⅲ 在Keil uVision4中,用C語言,不調用的子程序,會不會編譯
1. 「這兩者都是用相同軟體,有何區別?」
是不同的軟體。
2. 「為什麼8051不可以自動不編譯沒有調用的子程序?」
因為用戶可能在匯編中隱式調用某個字程序。
對於你所說「在編譯ARM(LPC1768)時,有子程序沒有被調用,不會有警告,不調用的程序有不會編譯為代碼」我持懷疑態度。
不管哪種方式編程都很有可能隱式調用函數的,如通過函數指針。所以不編譯非顯式調用的子程序是明顯違反編程人員意圖的行為。兩種可能:默認項目設置不當;或者對這類子程序需要添加特別的類型說明或編譯開關。
想知道兩種編譯套裝的區別,最好的資料就是其自帶的說明文檔。那幾十兆的說明文檔看下來包你受益無窮。
Ⅳ 計算機通過什麼可以查詢程序代碼
10 代碼編輯、編譯、審查
10-1:打開編譯器的所有告警開關對程序進行編譯。
10-2:在產品軟體(項目組)中,要統一編譯開關選項。
10-3:通過代碼走讀及審查方式對代碼進行檢查。
說明:代碼走讀主要是對程序的編程風格如注釋、命名等以及編程時易出錯的內容進行檢查,可由開發人員自己或開發人員交叉的方式進行;代碼審查主要是對程序實現的功能及程序的穩定性、安全性、可靠性等進行檢查及評審,可通過自審、交叉審核或指定部門抽查等方式進行。
10-4:測試部測試產品之前,應對代碼進行抽查及評審。
10-1:編寫代碼時要注意隨時保存,並定期備份,防止由於斷電、硬碟損壞等原因造成代碼丟失。
10-2:同產品軟體(項目組)內,最好使用相同的編輯器,並使用相同的設置選項。
說明:同一項目組最好採用相同的智能語言編輯器,如Muiti Editor,Visual Editor等,並設計、使用一套縮進宏及注釋宏等,將縮進等問題交由編輯器處理。
10-3:要小心地使用編輯器提供的塊拷貝功能編程。
說明:當某段代碼與另一段代碼卜讓前的處理功能相似時,許多開發人員都用編輯器提供的塊拷貝功能來完成這段代碼的編寫。由於程序功能相近,故所使用的變數、採用的表達式等在功能及命名上可能都很相近,所以使用塊拷貝時要注意,除了修改相應的程序外,一定要把使用的每個變數仔細查看一遍,以改成正確的。不應指望編譯器能查出所有這種錯誤,比如當使用的是全局變數時,就有可能使某種錯誤隱藏下來。
10-4:合理地設計軟體系統目錄,方便開發人員使用。
說明:方便、合理的軟體系統目錄,可提高工作效率。目錄構造的原則是方便有關源程序的存儲、查詢、編譯、鏈接等工作,同時目錄中還應具有工作目錄----所有的編譯、鏈接等工作應在此目錄中進行,工具目錄----有關文件編輯器、文件查找等工具可存放在此目錄中。
10-5:某些語句經編譯後產生告警,但如果你認為它是正確的,那麼應通過某種手段去掉告警信息。
說明滑碼:在Borland C/C++中,可用「#pragma warn」來關掉或打開某些告警。
示例:
#pragma warn -rvl //型清 關閉告警
int examples_fun( void )
{
// 程序,但無return語句。
}
#pragma warn +rvl // 打開告警
編譯函數examples_fun時本應產生「函數應有返回值」告警,但由於關掉了此告警信息顯示,所以編譯時將不會產生此告警提示。
10-6:使用代碼檢查工具(如C語言用PC-Lint)對源程序檢查。
10-7:使用軟體工具(如 LogiSCOPE)進行代碼審查。
Ⅳ zabbix告警配置
概述
假設我們配置了一些監控項和觸發器,現在當觸發器狀態改變時會獲取一些發生的事件,是時候考慮下一步行動了。
我們不可能一直盯著觸發器或者事件列表,當發生一些標志性的事件時發送警告再好不過。當問題發生,關注這些的用戶都會被通知。
zabbix提供主要的功能就是發送告警就是這個原因。哪些人?在什麼時候?應該收到哪些信息是可以被定義的。
為了發送和接收來自zabbix的告警,你必須:
定義媒介
配置發送信息到定義媒介的動作
動作由 觸發條件 和 操作 組成。基本上當條件符合時,操作被執行。兩個主要的操作是 發送消息 和 執行遠程命令
為了發現和自動注冊創建的事件,一些額外的操作是可用的,包含添加或者刪除主機,鏈接模板等
一、媒介(Media types)
概述
Media 是用於發送zabbix的消息與告警的遞送通道
可以定義一下媒介類型
E-mail
SMS
Jabber
Ez Texting
Custom alertscripts
1、 E-mail
為消息定義E-mail發送通道,需要配置e-mail 作為媒介類型並且傳遞指定的地址給用戶
配置
依次點擊 管理——>報警媒介類型,點擊創建媒介類型(或者點擊預先定義的媒介類型 E-mail)
媒介類型表包含通常的媒介類型屬性
所有重要的欄位都會標記紅星
Name 媒介類型名字
Type 選擇Email作為類型
SMTP server 設置stmp伺服器作為處理信息的出口
SMTP server port 設置smtp服務的埠,這個參數從zabbix3.0開始支持
SMTP helo 這是正確的stmp鏈接值,通常為域名
SMTP email 這個地址會被用於信息發送者,用來發送消息,添加發送者的顯示名 如 Zabbix_info則zabbix_info<[email protected]>
幾個可以生效的配置:
[email protected] 只有郵箱地址,不需要尖括弧
zabbix_info<[email protected]> 顯示名與郵件地址,地址寫在尖括弧中
監控系統<[email protected]> 使用UTF-8格式的顯示名
Connection security 選擇鏈接安全級別,None為不使用ssl選項,starttls 使用 CURLOPT_USE_SSL參數,SSL/TLS則CURLOPT_USE_SSL可選
SSL verify peer 標記checkbox同步SMTP服務的SSL證書,
Authentication 認證方法
Username 用戶名
Password 密碼
Enabled 啟用媒介
注意 : 為了使SMTP中的authentication 選項可用,zabbix在編譯時,需要帶--with-libcurl參數 使用cURL7.20.0或更高版本
第二個選項卡options
第二個選項卡options配置了告警的處理流程。同樣的options配置在其他的媒介類型中也存在。
所有媒介都是並行處理的,當前最大會話每個媒介自己定義,但是zabbix服務的告警處理總數被參數(zabbix_sever.conf)StartAlerters所限制。同一觸發器生成的告警會序列化的處理
options表
concurrent sessions 並發會話數,三個選項,one(一個),unlimited(不限制),custom(自定義)
Attempts 嘗試發送告警的次數,如果設置為1,則zabbix會發送以此通知,並且失敗時不會重發
Attempts interval 重發通知的頻率,發送失敗時重發的間隔
配置用戶的媒介
依次點擊 Administration(管理)--->Users(用戶)
點擊用戶的屬性表,在Media(媒介)表中點擊add
type 選擇Email作為類型
send to 指定email地址,可以點擊add添加多個地址,同理此地址也可設置顯示名如Zabbix_admin<[email protected]>或者[email protected]
when active 設置發送時間如工作日(1-5,09:00-18:00)可以使用宏
Use if severity 指定想要接受的告警等級
status 啟用與否
2、SMS
zabbix發送簡訊,使用串列GSM調試解調器連接到zabbix server的serial port
先決條件:
串列設備(正常情況下在linux的/dev/ttyS0)的速度取決於modem。zabbix不設置串列鏈接的速度。
zabbix user擁有對串列設備的讀寫許可權,運行ls -l /dev/ttyS0查看當前許可權
GSM調試解調器擁有PIN碼,PIN也可以禁用使用命令 AT+CPIN="NNNN"輸入PIN, 必須有雙引號。
已經測試好的modem Siemens MC35 Teltonika ModemCOM/G10
配置SMS作為發送通道,需要配置SMS作為媒介類型並且在用戶界面配置接收手機號
配置
依次點擊 Administration--->Media types,點擊創建media type或使用預先的配置
sms的Media type表屬性
Description media type名
Type 選擇SMS
GSM modem 選擇設備如 /dev/ttyS0
options選項卡見E-mail
配置用戶媒介
依次點擊 Administration(管理)--->Users(用戶)
點擊用戶的屬性表,在Media(媒介)表中點擊add
types 選擇SMS作為媒介
Send to 輸入用戶手機號
When active 設置發送時間如工作日(1-5,09:00-18:00)可以使用宏
Use if severity 指定想要接受的告警等級
status 啟用與否
3、Jabber (略)
4、Ez Texing(略)
5、Custom alertscripts
如果不滿足於存在的媒介來發送警告,可以自定義腳本進行發送
警告腳本在zabbix server上執行,這些腳本位於server配置文件AlertScriptsPath變數(默認/usr/local/share/zabbix/alertscripts)
腳本示例:
#!/bin/bash
to=$1
subject=$2
body=$3
cat <<EOF |mail -s "$subject" "$to"
$bodyEOF
從3.4開始zabbix會檢查exit code(shell執行返回碼,0為成功),若exit code 不等於0,則認為執行失敗,zabbix會重復執行
script不保存環境變數,所以環境變數要精確指定
配置
依次點擊 Administration--->Media types,點擊創建media type
mediatype表屬性
Name 輸入媒介的名字
Type 選擇Script作為類型
Script name 輸入腳本的名字(zabbix server中的腳本文件)
Script parameters 添加命令行參數到腳本
可支持ALERT.SENDTO}、{ALERT.SUBJECT}、{ALERT.MESSAGE}等宏,
{ALERT.SENDTO} 用戶媒介中的send to(收件人)的值
{ALERT.SUBJECT} 動作配置中的Default subject(默認標題)
{ALERT.MESSAGE} 動作配置中的Default message(消息內容)
options表中定義了處理流程,見E-mail的說明
配置用戶媒介User media
依次點擊 Administration(管理)--->Users(用戶)
點擊用戶的屬性表,在Media(媒介)表中點擊add
用戶媒介屬性
Type 選擇自定義腳本的媒介類型
Send to 指定告警接收人
When active 設置發送時間如工作日(1-5,09:00-18:00)可以使用宏
Use if serverity 指定想要接受的告警等級
status 啟用與否
二、動作
如果你希望發生事件時會觸發一些操作,那麼你需要配置action
動作可以定義回應所有支持的事件類型,
事件類型:
Trigger events觸發器事件,當觸發器狀態從ok改變到problem或相反。
Discovery events 當自動發現產生
Auto registration events當新的agent自動注冊時,或者經注冊過的主機元數據改變
Internal events當監控項變為不支持或觸發器狀態變為unknown時
配置一個動作
依次 Configuration ——>Actions
從event source中選擇需要的源(分為:觸發器源,自動發現源,自動注冊源,事件源)
點擊創建動作
選擇操作執行的條件
選擇具體操作
選擇恢復操作
動作表的屬性
Name 唯一動作名
Type of calcaulation 選擇條件觸發的計算方法
And 必須符合所有條件
Or 只要一個條件符合即可
And/Or 結合二者,不同類型的條件用And,同一類型的條件用Or
Custom expression 用戶自定義
Conditions 觸發動作的一系列條件、
New condition 選擇新的動作觸發條件
Enabled 啟用動作
條件設置
基於觸發器的條件
Application 應用集
Host group 主機組
Template 模板
Host 主機
Tag 標簽(串)
tag value 標簽值
Trigger 觸發器
Trigger name 觸發器名字
Trigger severity 觸發器等級
Time period 觸發時間
Problem is suppressed 觸發問題是否意料之中,如主機維護
基於自動發現的條件
Host IP 指定主機ip地址自動發現范圍 格式: 單獨的ip:192.168.1.33 范圍ip: 192.168.1-101.1-254 Ip mask: 192.168.4。0/24
Service type 服務類型
service port 服務埠
Discovery rule 指定自動發現規則
Discovery check
Discovery object
Discovery status
Uptime/Downtime
Received value
Proxy
基於自動注冊的條件
Host metadata 由zabbix_agentd.conf 文件中的HostMetadata變數定義
Host name
Proxy
基於內部事件的條件
Application
Event type
Host group
Template
Host
條件匹配後,就需要執行響應的動作了
可以支持以下動作
send a message
execute a remote command
add host
remove host
enable host
disable host
add to host group
remove from host group
link to template
unlink from template
set host inventory mode
執行遠程命令
確保配置文件中(zabbix_agentd.conf)EnableRemoteCommands 參數設置為1
加入zabbix用戶到sudo,vim /etc/sudoer
zabbix ALL=NOPASS: ALL #所有命令不需密碼
zabbix ALL=NOPASS: /etc/init.d/apache restart #指定某一命令不需要密碼
觸發操作後,使用宏 編輯信息
如 告警信息模板
標題 伺服器:{HOST.NAME} - 發生: {TRIGGER.NAME}故障
信息 告警主機:{HOST.NAME}
告警地址:{HOST.IP}
監控項目:{ITEM.NAME}
監控取值:{ITEM.LASTVALUE}
告警等級:{TRIGGER.SEVERITY}
當前狀態:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警時間:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
恢復信息
標題 伺服器:{HOST.NAME} - {TRIGGER.NAME} 已恢復
信息 告警主機:{HOST.NAME}
告警地址:{HOST.IP}
監控項目:{ITEM.NAME}
監控取值:{ITEM.LASTVALUE}
告警等級:{TRIGGER.SEVERITY}
當前狀態:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警時間:{EVENT.DATE} {EVENT.TIME}
恢復時間:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持續時間:{EVENT.AGE}
事件ID:{EVENT.ID}