
source: technews
有喔!筆者上次在光線較不充足的室內用 Sony XZ1 Compact 前鏡頭自拍,發現螢幕閃了一下…覺得奇怪,怎麼按快門畫面會瞬間變白1-2秒?多試了幾次才發現,原來是靠螢幕亮白光來當閃光燈嗎?找了一些資料,發現的確現在很多新手機都使用螢幕來當前鏡頭的打光了,畢竟前鏡頭都是自拍居多,用拍照的閃光燈也許太亮了?也有些手機螢幕不是變全白,而是變膚色的畫面,應該是經過實驗證明,透過膚色的打光拍出來比較有美肌效果吧XD








音源 https://www.youtube.com/watch?v=LdWpxBPTxP4不知道陰謀論是什麼的,這裡引述羅胖的舉例:
逐字稿 http://www.luojiji.com/thread-7255-1-1.html
什么是阴谋论呢?比如,说艾滋病毒是美国人研发出来祸害世界的武器;911事件是美国政府自导自演的;共济会正在控制世界等等。針對為什麼相信陰謀論這個議題,邏輯思維整理出三個原因:
你可以想象一下,假如你还是一个在非洲大草原上行走的原始人。你路过一片草丛,突然听到一阵窸窸碎碎的声音——那可能是一条致命的蛇,也可能是一只在捕猎的狮子,也可能只是一阵风。你不知道,那你该怎么办?是不管三七二十一掉头就跑,还是镇定自若等看明白再说呢?邏輯思維有提到演化的部分到此,至於我的第二則來源是看了一本書《好奇心的幸福力量》,書中提到因為大腦演化的設計,我們不斷在正向與負向間尋找平衡,而我們天生就會注意到負向事物,就叫做負向偏誤 (negativity bias)。
假设我们的老祖宗有两种人:一种人,凡事都要搞个明白才行动;另一种人,很容易轻信一件事。那前一种人,早就被野兽吃掉了,没有后代留下来。而我们现代人,其实都是后一种人,也就是那些“轻易就相信一件事”的老祖宗的后代。
The negativity bias is the phenomena by which humans give more psychological weight to bad experiences than a good ones. In fact, some researchers assert that negative emotions have an impact close to 3x stronger than positive emotions.書中提到,有負向偏誤,自然也有正向補償 (positivity offset)。
當感到安全時,我們會表現出對探索新事物、尋找新體驗的輕微渴望,也希望獲得回報與刺激。如果缺乏這種補償,我們就永遠不會學習、擴展、成長或演化。我覺得負向偏誤和正向補償這兩個演化的觀點很有趣,正好反思了一下自己的近況。最近進入工作的疲乏狀態一陣子了,覺得工作上沒有太多新的事物,沒有看到什麼新奇有趣的事物能激發我的熱情,以演化的觀點來看,也許就是正向補償發揮了作用吧?工作一段時期,覺得穩定了,好像能接觸的東西都看過了,有一種成長變得緩慢的感覺。因此內心會浮現要怎麼樣才能獲得更多新刺激?怎麼樣才能加速成長?
=,之後執行時都會回來改變等號左邊的變數(recursively),而另一種使用:=,將當下的值指定給等號左邊的變數(simply),之後不再更動。x = foo
y = $(x) bar
x = later
echo $(y) 的輸出結果會是 later bar。x := foo
y := $(x) bar
x := later
echo $(y) 的輸出結果是 foo bar。:=,結果根本不是這個原因…只好繼續找資料,深追問題。$(shell ... ) 動態指派變數的話,rule 在執行前就會先展開 $(shell ... ) 了,意思是 $(shell ...) 比 rule 還早被執行。make 後會先砍掉所有 rom 檔,並建立 test.rom,確保當前目錄只有 test.rom,接著透過 find 指令查找 rom 檔,將檔名 assign 給變數 ROM。all:
@rm -rf *.rom
@touch test.rom
$(eval ROM := $(shell find ./ -name *.rom))
@echo name=$(ROM)
情境一、當前目錄不存在 *.rom 時:[user][linux][~/test]% ls *.rom
ls: No match.
[user][linux][~/test]% make all
name=
情境二、當前目錄存在 *.rom 時:[user][linux][~/test]% touch existed.rom
[user][linux][~/test]% ls *.rom
existed.rom
[user][linux][~/test]% make all
name=./existed.rom
造成上面兩個結果不同的原因,因為 $(shell ...)先執行了!有注意到情境二的 name 是 existed.rom 而非 Makefile 中建立的 test.rom 嗎?` 執行 find 指令,例如:all:
@rm -rf *.rom
@touch test.rom
$(eval ROM := `find ./ -name *.rom`)
echo "before mv: name=$(ROM)"
mv $(ROM) newname.rom
echo "after mv: name=$(ROM)"
輸出結果:[user][linux][~/test]% make all
echo "before mv: name=`find ./ -name *.rom`"
before mv: name=./test.rom
mv `find ./ -name *.rom` newname.rom
echo "after mv: name=`find ./ -name *.rom`"
after mv: name=./newname.rom
的確,使用 backquote 變成當下才去執行指令,符合我的預期。但其實我是想把 find 的輸出結果當成 constant string 來使用,而實際上 $(ROM) 存的卻是完整的指令,不是指令執行完的輸出結果…5 is the normal size
↓分隔線↓ 中文字型測試
Normal text
Bold text
Italic text
text block 1
text block 2
This is text block 3...test with large widthhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
and the second line
int main(void)
{
printf("This is code block...test with large widthhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
return 0;
}
Finally, test with block quote
Written with StackEdit.
yum install crash
接下來輪到 vmlinux,需安裝與 vmcore 相對應的 kernel 版本才行,否則會遇到 vmlinux and vmcore do not match! 的錯誤。[root@localhost ~]# strings vmcore | grep OSRELEASE
OSRELEASE=3.10.0-327.el7.x86_64
^C
[root@localhost ~]#
現在得知OSRELEASE=3.10.0-327.el7.x86_64,就可以到 debuginfo.centos.org 下載對應版本的 kernel-debuginfo 了,其中 vmlinux 就包含在 debuginfo package 裡面。[root@localhost ~]# rpm -ivh kernel-debuginfo-common-x86_64-3.10.0-327.el7.x86_64.rpm
[root@localhost ~]# rpm -ivh kernel-debuginfo-3.10.0-327.el7.x86_64.rpm
安裝完畢,在以下目錄應該能找到所需的 vmlinux:[root@localhost ~]# find /usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/ -name vmlinux
/usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/vmlinux
[root@localhost ~]#
[root@localhost ~]# crash /usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/vmlinux vmcore
crash 7.1.5-2.el7
Copyright (C) 2002-2016 Red Hat, Inc.
...(略)
KERNEL: /usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/vmlinux
DUMPFILE: vmcore
CPUS: 8
DATE: Mon Apr 3 04:16:14 2017
UPTIME: 47 days, 02:41:16
LOAD AVERAGE: 0.74, 0.33, 0.18
TASKS: 676
NODENAME: xxx
RELEASE: 3.10.0-327.el7.x86_64
VERSION: #1 SMP Thu Oct 29 17:29:29 EDT 2015
MACHINE: x86_64 (2594 Mhz)
MEMORY: 31.7 GB
PANIC: "Kernel panic - not syncing: Watchdog detected hard LOCKUP on cpu 5"
PID: 0
COMMAND: "swapper/5"
TASK: ffff8808541f5c00 (1 of 8) [THREAD_INFO: ffff880852b98000]
CPU: 5
STATE: TASK_RUNNING (PANIC)
很好,有種進入新世界的喜悅,也獲得新的資訊 Kernel panic - not syncing: Watchdog detected hard LOCKUP on cpu 5 。有興趣可以 google 一下 soft/hard LOCKUP 的差別。bt 可以說是必用的指令之一。crash> bt
PID: 0 TASK: ffff8808541f5c00 CPU: 5 COMMAND: "swapper/5"
#0 [ffff88087fd459c8] machine_kexec at ffffffff81051beb
#1 [ffff88087fd45a28] crash_kexec at ffffffff810f2542
#2 [ffff88087fd45af8] panic at ffffffff8162ea73
#3 [ffff88087fd45b78] watchdog_overflow_callback at ffffffff8111b512
#4 [ffff88087fd45b88] __perf_event_overflow at ffffffff8115ed71
#5 [ffff88087fd45c00] perf_event_overflow at ffffffff8115f844
#6 [ffff88087fd45c10] intel_pmu_handle_irq at ffffffff810325a8
#7 [ffff88087fd45e60] perf_event_nmi_handler at ffffffff8163ebeb
#8 [ffff88087fd45e80] nmi_handle at ffffffff8163e339
#9 [ffff88087fd45ec8] do_nmi at ffffffff8163e4e9
#10 [ffff88087fd45ef0] end_repeat_nmi at ffffffff8163d771
[exception RIP: ioread8+66]
RIP: ffffffff81309532 RSP: ffff88087fd43e28 RFLAGS: 00000092
RAX: ffffc90013422a7e RBX: 0000000000000020 RCX: 0000000000000000
RDX: 0000000000009580 RSI: ffff88085f408a00 RDI: ffffc90013422a06
RBP: ffff88087fd43ea8 R8: 0000000000000000 R9: 0000000000000082
R10: ffff88085f403500 R11: 000e783a5cdff909 R12: 0000000000000022
R13: 000000000000000e R14: 0000000000000f50 R15: ffffffffa03fac10
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
--- <NMI exception stack> ---
#11 [ffff88087fd43e28] ioread8 at ffffffff81309532
#12 [ffff88087fd43e28] mx_interrupt at ffffffffa03f1940 [mxupcie]
#13 [ffff88087fd43eb0] handle_irq_event_percpu at ffffffff8111c2be
#14 [ffff88087fd43ef8] handle_irq_event at ffffffff8111c49d
#15 [ffff88087fd43f20] handle_fasteoi_irq at ffffffff8111f90a
#16 [ffff88087fd43f40] handle_irq at ffffffff81016ecf
#17 [ffff88087fd43f78] do_IRQ at ffffffff81647daf
--- <IRQ stack> ---
...(略)
可以看到發生問題的點在 [exception RIP: ioread8+66],其中 RIP 是一個 instruction pointer 的暫存器,它指向了正在被執行的指令的記憶體位置。更重要的是,我發現了在 call trace #12 顯示的 mx_interrupt at ffffffffa03f1940 [mxupcie] 正好是我們 driver 的一個函式。dis 命令將其反組譯:-l 參數可以直接指出 source code line number。crash> dis -l ioread8+66
/usr/src/debug/kernel-3.10.0-327.el7/linux-3.10.0-327.el7.x86_64/lib/iomap.c: 73
0xffffffff81309532 <ioread8+66>: movzbl %al,%eax
crash>
crash> dis -l ffffffffa03f1940
0xffffffffa03f1940 <mx_interrupt+384>: test $0xf,%al
crash>
注意到了嗎? 反組譯 ioread8+66 可以指出位於 iomap.c: 73,但是反組譯 mx_interrupt 所在位置 ffffffffa03f1940 卻不知道是哪一行程式。其實原因是沒有載入 driver module 的 symbol,所以認不出來,因此只要利用 mod 指令載入 module 2就沒問題囉!crash> mod -s mxupcie /mydriver/mxupcie.ko
MODULE NAME SIZE OBJECT FILE
ffffffffa03f9120 mxupcie 69583 /mydriver/mxupcie.ko
crash> dis -l ffffffffa03f1940
/mydriver/mxpcie.c: 2485
0xffffffffa03f1940 <mx_interrupt+384>: test $0xf,%al
crash>
最後得到 mxpcie.c: 2485 ,恭喜你終於可以開始對程式碼 debug 啦~!test $0xf,%al 這一行是否指到同一行程式碼,還好結果是相同的。 ↩