Xcode中和symbols有關(guān)的幾個(gè)設(shè)置

其實(shí)被這個(gè)問(wèn)題困擾了好久当悔,不過(guò)秉承著三分鐘熱度的新年新氣象贤旷,還是要多弄懂一點(diǎn)(⊙_⊙)ゞ

Symbols是什么東西呢祷安?雖然我對(duì)它沒(méi)有深入的了解,但是大概知道它的作用嗽桩。摘抄《深入理解計(jì)算機(jī)系統(tǒng)》里的一些描述:

一個(gè)典型的ELF可重定位目標(biāo)文件包含下面幾個(gè)節(jié):
... ...
.symtab:一個(gè)符號(hào)表岳守,它存放在程序中定義和引用的函數(shù)和全局變量信息。一些程序員錯(cuò)誤地認(rèn)為必須通過(guò)-g選項(xiàng)來(lái)編譯程序才能得到符號(hào)表信息碌冶。實(shí)際上湿痢,每個(gè)可重定位目標(biāo)文件在.symtab中都有一張符號(hào)表。然而扑庞,和編譯器中的符號(hào)表不同譬重,.symtab符號(hào)表不包含局部變量的條目。
... ...
.debug:一個(gè)調(diào)試符號(hào)表罐氨,其條目是程序中定義的局部變量和類型定義臀规,程序中定義和引用的全局變量,以及原始的C源文件栅隐。只有以-g選項(xiàng)調(diào)用編譯驅(qū)動(dòng)程序時(shí)才會(huì)得到這張表塔嬉。
... ...

為了構(gòu)造可執(zhí)行文件,鏈接器必須完成兩個(gè)主要任務(wù):

  • 符號(hào)解析(symbol resolution)租悄。目標(biāo)文件定義和引用符號(hào)谨究。符號(hào)解析的目的是將每個(gè)符號(hào)引用剛好和一個(gè)符號(hào)定義聯(lián)系起來(lái)。
  • 重定位(relocation)泣棋。編譯器和匯編器生成從地址0開(kāi)始的代碼和數(shù)據(jù)節(jié)胶哲。鏈接器通過(guò)把每個(gè)符號(hào)定義與一個(gè)存儲(chǔ)器位置聯(lián)系起來(lái),然后修改所有對(duì)這些符號(hào)的引用潭辈,使得它們指向這個(gè)存儲(chǔ)器位置纪吮,從而重定位這些節(jié)。

Objective-C有一些自己的生成符號(hào)的規(guī)則萎胰,比如文檔中有提到:

The dynamic nature of Objective-C complicates things slightly. Because the code that implements a method is not determined until the method is actually called, Objective-C does not define linker symbols for methods. Linker symbols are only defined for classes.

Objective-C不會(huì)為方法定義鏈接符號(hào),只會(huì)為類定義鏈接符號(hào)棚辽。

可以在終端中用nm命令查看一個(gè)可重定位文件或可執(zhí)行文件的符號(hào)表技竟,其中加上-a參數(shù)可以顯示包括調(diào)試符號(hào)在內(nèi)的所有符號(hào)。

合理的選擇與symbols有關(guān)的設(shè)置選項(xiàng)屈藐,可以縮減app的大小榔组,一定程度上能阻礙與源代碼有關(guān)的信息被攻擊者獲得熙尉。Xcode的build setting中,有不少與symbols有關(guān)搓扯,現(xiàn)在我來(lái)依次試驗(yàn)這幾個(gè)設(shè)置選項(xiàng)检痰,了解一下它們的具體作用。

剛開(kāi)始的時(shí)候锨推,我使用Xcode7.2.1新建了一個(gè)工程铅歼,以下試驗(yàn)均在run和DEBUG模式下進(jìn)行。


Generate Debug Symbols [GCC_GENERATE_DEBUGGING_SYMBOLS]



在Xcode7.2.1中换可,Generate Debug Symbols這個(gè)設(shè)置在DEBUG和RELEASE下均默認(rèn)為YES椎椰。

官方文檔對(duì)這個(gè)設(shè)置的說(shuō)明:

Enables or disables generation of debug symbols. When debug symbols are enabled, the level of detail can be controlled by the build 'Level of Debug Symbols' setting.

調(diào)試符號(hào)是在編譯時(shí)生成的。在Xcode中查看構(gòu)建過(guò)程沾鳄,可以發(fā)現(xiàn)慨飘,當(dāng)Generate Debug Symbols選項(xiàng)設(shè)置為YES時(shí),每個(gè)源文件在編譯成.o文件時(shí)译荞,編譯參數(shù)多了-g-gmodules兩項(xiàng)瓤的。但鏈接等其他的過(guò)程沒(méi)有變化。

Clang文檔對(duì)-g的描述是:

Generate complete debug info.

當(dāng)Generate Debug Symbols設(shè)置為YES時(shí)吞歼,編譯產(chǎn)生的.o文件會(huì)大一些圈膏,當(dāng)然最終生成的可執(zhí)行文件也大一些。

當(dāng)Generate Debug Symbols設(shè)置為NO的時(shí)候浆熔,在Xcode中設(shè)置的斷點(diǎn)不會(huì)中斷本辐。但是在程序中打印[NSThread callStackSymbols],依然可以看到類名和方法名医增,比如:

** 0   XSQSymbolsDemo                      0x00000001000667f4 -[ViewController viewDidLoad] + 100**

在程序崩潰時(shí)慎皱,也可以得到帶有類名和方法名的函數(shù)調(diào)用棧


現(xiàn)在把Generate Debug Symbols設(shè)置回YES,開(kāi)始試驗(yàn)下一個(gè)設(shè)置叶骨。


Debug Information Level [CLANG_DEBUG_INFORMATION_LEVEL]



在Xcode 7.2.1中茫多,Debug Information Level的默認(rèn)值為Compiler default,還有一個(gè)選項(xiàng)是Line tables only忽刽。

官方文檔的描述是:

Toggles the amount of debug information emitted when debug symbols are enabled. This can impact the size of the generated debug information, which can matter in some cases for large projects (such as when using LTO).

當(dāng)我把Debug Information Level設(shè)置為Line tables only的時(shí)候天揖,然后構(gòu)建app,每個(gè)源文件在編譯時(shí)跪帝,都多了一個(gè)編譯參數(shù):-gline-tables-only

Clang的文檔中這樣解釋-gline-tables-only

Generate line number tables only.
This kind of debug info allows to obtain stack traces with function names, file names and line numbers (by such tools as gdb or addr2line). It doesn’t contain any other data (e.g. description of local variables or function parameters).

這種類型的調(diào)試信息允許獲得帶有函數(shù)名今膊、文件名和行號(hào)的函數(shù)調(diào)用棧,但是不包含其他數(shù)據(jù)(比如局部變量和函數(shù)參數(shù))伞剑。

所以當(dāng)Debug Information Level設(shè)置為Line tables only的時(shí)候斑唬,斷點(diǎn)依然會(huì)中斷,但是無(wú)法在調(diào)試器中查看局部變量的值:

現(xiàn)在把Debug Information Level設(shè)置回Compiler default,然后試驗(yàn)下一個(gè)設(shè)置恕刘。


Strip Linked Product [STRIP_INSTALLED_PRODUCT]



在Xcode7.2.1中照雁,Strip Linked Product在DEBUG和RELEASE下均默認(rèn)為YES矮湘。

這是一個(gè)讓我困惑了很久的設(shè)置選項(xiàng)拴孤。當(dāng)我把這一設(shè)置選項(xiàng)改為NO的時(shí)候豆挽,最終構(gòu)建生成的app大小沒(méi)有任何變化,這讓我覺(jué)得很奇怪含蓉。

原來(lái)频敛,Strip Linked Product也受到Deployment Postprocessing設(shè)置選項(xiàng)的影響。在Build Settings中谴餐,我們可以看到姻政,Strip Linked Product是在Deployment這欄中的,而Deployment Postprocessing相當(dāng)于是Deployment的總開(kāi)關(guān)岂嗓。
Xcode7.2.1中汁展,Deployment Postprocessing在DEBUG和RELEASE下均默認(rèn)為NO

現(xiàn)在我們把Deployment Postprocessing設(shè)置為YES厌殉,對(duì)比Strip Linked Product設(shè)為YESNO的這兩種情況食绿,發(fā)現(xiàn)當(dāng)Strip Linked Product設(shè)為YES的時(shí)候,app的構(gòu)建過(guò)程多了這樣兩步:

  1. 在app構(gòu)建的開(kāi)始公罕,會(huì)生成一些.hmap輔助文件器紧;(為什么會(huì)多出這一步我好像還不太清楚)
  2. 在app構(gòu)建的末尾,會(huì)執(zhí)行Strip操作楼眷。




當(dāng)Strip Linked Product設(shè)為YES的時(shí)候铲汪,運(yùn)行app,斷點(diǎn)不會(huì)中斷罐柳,在程序中打印[NSThread callStackSymbols]也無(wú)法看到類名和方法名:

** 0   XSQSymbolsDemo                      0x000000010001a7f4 XSQSymbolsDemo + 26612**

而在程序崩潰時(shí)掌腰,函數(shù)調(diào)用棧中也無(wú)法看到類名和方法名,注意右上角變成了unnamed_function:


繼續(xù)保持Strip Linked ProductDeployment PostprocessingYES张吉,下面來(lái)看看Strip Style設(shè)置選項(xiàng)齿梁。


Strip Style [STRIP_STYLE]



在Xcode7.2.1中,Strip Style在DEBUG和RELEASE下均默認(rèn)All Symbols肮蛹。

官方文檔中對(duì)Strip Style的描述:

Defines the level of symbol stripping to be performed on the linked product of the build. The default value is defined by the target's product type. [STRIP_STYLE]

All Symbols - Completely strips the binary, removing the symbol table and relocation information. [all, -s]
Non-Global Symbols - Strips non-global symbols, but saves external symbols. [non-global, -x]
Debugging Symbols - Strips debugging symbols, but saves local and global symbols. [debugging, -S]

選擇不同的Strip Style時(shí)勺择,app構(gòu)建末尾的Strip操作會(huì)被帶上對(duì)應(yīng)的參數(shù)。

如果選擇debugging symbols的話伦忠,函數(shù)調(diào)用棧中省核,類名和方法名還是可以看到的。

如果我們構(gòu)建的不是一個(gè)app昆码,而是一個(gè)靜態(tài)庫(kù)芳撒,需要注意邓深,靜態(tài)庫(kù)是不可以strip all的。這時(shí)構(gòu)建會(huì)失敗笔刹。想想符號(hào)在重定位時(shí)的作用,如果構(gòu)建的靜態(tài)庫(kù)真的能剝離所有符號(hào)冬耿,那么它也就沒(méi)法被鏈接了舌菜。

現(xiàn)在我們保持Deployment PostprocessingYESStrip Linked Product改回NO亦镶,Strip Style改回All Symbols日月,接下來(lái)看下一個(gè)設(shè)置。


Strip Debug Symbols During Copy [COPY_PHASE_STRIP]



網(wǎng)上有很多文章缤骨,以為Strip Debug Symbols During Copy開(kāi)啟的時(shí)候爱咬,app中的調(diào)試符號(hào)會(huì)被剝離掉。我感覺(jué)他們混淆了Strip Linked ProductStrip Debug Symbols During Copy的用法绊起。

文檔上的描述是:

Activating this setting causes binary files which are copied during the build (e.g., in a Copy Bundle Resources or Copy Files build phase) to be stripped of debugging symbols. It does not cause the linked product of a target to be stripped (use Strip Linked Product for that).

Strip Debug Symbols During Copy中的During Copy是什么意思呢精拟?我覺(jué)得可能是app中引入的某些類型的庫(kù),在app的構(gòu)建過(guò)程中需要被復(fù)制一次虱歪。雖然我暫時(shí)沒(méi)找全究竟什么樣的“庫(kù)”需要在app構(gòu)建時(shí)被復(fù)制蜂绎,但是我發(fā)現(xiàn),當(dāng)app中包含extension或者watch app的時(shí)候笋鄙,構(gòu)建過(guò)程中會(huì)有Copy的步驟:

當(dāng)我將app(而非extension)的Strip Debug Symbols During Copy設(shè)置為YES之后师枣,在這句copy的命令中會(huì)多出-strip-debug-symbols參數(shù)。

但是這里萧落,strip并不能成功践美,并且出現(xiàn)了warning:

warning: skipping copy phase strip, binary is code signed: /Users/xsq/Library/Developer/Xcode/DerivedData/XSQSymbolsDemo-cysszdsykroyyddkvvyffgboglvo/Build/Products/Debug-iphoneos/Today.appex/Today

這似乎是由于app中的today extention已經(jīng)經(jīng)過(guò)了code sign,導(dǎo)致無(wú)法被篡改引起的警告找岖。

那么如果略過(guò)code sign的過(guò)程陨倡,是否就能成功strip呢?我想使用模擬器調(diào)試可以略過(guò)code sign過(guò)程宣增,于是便在模擬器上試了試玫膀。果然這個(gè)warning消失了。

Strip Debug Symbols During Copy設(shè)置為YES時(shí)爹脾,打開(kāi)對(duì)應(yīng).app文件的“顯式包內(nèi)容”帖旨,可以看到,/PlugIns/Today.appex文件的大小變小了灵妨。(不過(guò)這些只能在使用模擬器時(shí)奏效)

Strip Debug Symbols During Copy置為YES的時(shí)候解阅,today extension中的斷點(diǎn)將不會(huì)中斷,但是打印[NSThread callStackSymbols]時(shí)的類名和方法名還是可以看見(jiàn)的泌霍。

現(xiàn)在我們把Strip Debug Symbols During Copy設(shè)置回NO货抄,來(lái)看看下一個(gè)設(shè)置述召。


Debug Information Format [DEBUG_INFORMATION_FORMAT]



Xcode7.2.1中,Debug Information Format在DEBUG下默認(rèn)為DWARF蟹地,在RELEASE下默認(rèn)為DWARF with dSYM File积暖。

官方文檔的解釋是:

This setting controls the format of debug information used by the developer tools. [DEBUG_INFORMATION_FORMAT]

DWARF - Object files and linked products will use DWARF as the debug information format. [dwarf]
DWARF with dSYM File - Object files and linked products will use DWARF as the debug information format, and Xcode will also produce a dSYM file containing the debug information from the individual object files (except that a dSYM file is not needed and will not be created for static library or object file products). [dwarf-with-dsym]

當(dāng)Debug Information FormatDWARF with dSYM File的時(shí)候,構(gòu)建過(guò)程中多了一步Generate dSYM File:


最終產(chǎn)出的文件也多了一個(gè)dSYM文件怪与。

不過(guò)夺刑,既然這個(gè)設(shè)置叫做Debug Information Format,所以首先得有調(diào)試信息分别。如果此時(shí)Generate Debug Symbols選擇的是NO的話遍愿,是沒(méi)法產(chǎn)出dSYM文件的。

dSYM文件的生成耘斩,是在Strip等命令執(zhí)行之前沼填。所以無(wú)論Strip Linked Product是否開(kāi)啟,生成的dSYM文件都不會(huì)受影響括授。

不過(guò)正如文檔中所說(shuō)坞笙,無(wú)法為靜態(tài)庫(kù)生成dSYM文件。即便為給一個(gè)靜態(tài)庫(kù)的Debug Information Format設(shè)置為DWARF with dSYM File刽脖,構(gòu)建過(guò)程中依然不會(huì)有生成dSYM文件的步驟羞海。


一種配置方案



了解了每個(gè)設(shè)置的意思,個(gè)人覺(jué)得對(duì)于一個(gè)普通的app來(lái)說(shuō)可以這樣配置這些設(shè)置:

  • Generate Debug Symbols:DEBUG和RELEASE下均設(shè)為YES(和Xcode默認(rèn)一致)曲管;
  • Debug Information Level:DEBUG和RELEASE下均設(shè)為Compiler default(和Xcode默認(rèn)一致)却邓;
  • Deployment Postprocessing:DEBUG下設(shè)為NO,RELEASE下設(shè)為YES院水,這樣RELEASE模式下就可以去除符號(hào)縮減app的大欣搬恪(但是似乎設(shè)置為YES后,會(huì)牽涉一些和bitcode有關(guān)的設(shè)置檬某,對(duì)于bitcode暫時(shí)還不太了解(′?_?`))撬腾;
  • Strip Linked Product:DEBUG下設(shè)為NO,RELEASE下設(shè)為YES恢恼,用于RELEASE模式下縮減app的大忻裆怠;
  • Strip Style:DEBUG和RELEASE下均設(shè)為All Symbols(和Xcode默認(rèn)一致)场斑;
  • Strip Debug Symbols During Copy:DEBUG下設(shè)為NO漓踢,RELEASE下設(shè)為YES
  • Debug Information Format:DEBUG下設(shè)為DWARF漏隐,RELEASE下設(shè)為DWARF with dSYM File喧半,dSYM文件需要用于符號(hào)化crash log(和Xcode默認(rèn)一致);

參考

深入理解計(jì)算機(jī)系統(tǒng)
Build Setting Reference
Skipping Copy Phase Strip
xcode build settings for debug symbol
Clang Compiler User’s Manual
Symbolification: Shipping Symbols
Technical Q&A QA1490


2016.04.17更新



某天青责,我看了公司的項(xiàng)目的設(shè)置挺据,發(fā)現(xiàn)Deployment Postprocessing這項(xiàng)在DEBUG和RELEASE下均為NO取具,讓我有些奇怪,難道公司的項(xiàng)目沒(méi)有濾去調(diào)試符號(hào)扁耐?
于是我archive了一下暇检,發(fā)現(xiàn),在archive的過(guò)程中做葵,其實(shí)是跑了strip的命令的占哟,讓我有點(diǎn)吃驚。這說(shuō)明run和archive的構(gòu)建過(guò)程是不同的酿矢。

查了官方文檔,暫時(shí)沒(méi)能查到run和archive到底有哪里不同怎燥,但是這里對(duì)ACTION的解釋讓我有些在意瘫筐。對(duì)ACTION的設(shè)置會(huì)影響到Deployment Postprocessing的默認(rèn)值,即當(dāng)$ACTION = install的時(shí)候铐姚,Deployment Postprocessing默認(rèn)為YES策肝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市隐绵,隨后出現(xiàn)的幾起案子之众,更是在濱河造成了極大的恐慌,老刑警劉巖依许,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棺禾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡峭跳,警方通過(guò)查閱死者的電腦和手機(jī)膘婶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛀醉,“玉大人悬襟,你說(shuō)我怎么就攤上這事≌螅” “怎么了脊岳?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)垛玻。 經(jīng)常有香客問(wèn)我割捅,道長(zhǎng),這世上最難降的妖魔是什么夭谤? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任棺牧,我火速辦了婚禮,結(jié)果婚禮上朗儒,老公的妹妹穿的比我還像新娘颊乘。我一直安慰自己参淹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布乏悄。 她就那樣靜靜地躺著浙值,像睡著了一般。 火紅的嫁衣襯著肌膚如雪檩小。 梳的紋絲不亂的頭發(fā)上开呐,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音规求,去河邊找鬼筐付。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阻肿,可吹牛的內(nèi)容都是我干的瓦戚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼丛塌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼较解!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起赴邻,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤印衔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后姥敛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奸焙,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年徒溪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忿偷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臊泌,死狀恐怖鲤桥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渠概,我是刑警寧澤茶凳,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站播揪,受9級(jí)特大地震影響贮喧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猪狈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一箱沦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雇庙,春花似錦谓形、人聲如沸灶伊。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)聘萨。三九已至,卻和暖如春童太,著一層夾襖步出監(jiān)牢的瞬間米辐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工书释, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翘贮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓爆惧,卻偏偏與公主長(zhǎng)得像择膝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子检激,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 【轉(zhuǎn)載】曾夢(mèng)想仗劍走天涯 1.Xcode IDE概覽 說(shuō)明:從左到右,依次是“導(dǎo)航窗格(Navigator)->邊...
    06a6a973d7ab閱讀 3,821評(píng)論 2 20
  • 1.Xcode IDE概覽 說(shuō)明:從左到右腹侣,依次是“導(dǎo)航窗格(Navigator)->邊列(Gutter)->焦點(diǎn)...
    小地閱讀 5,357評(píng)論 0 9
  • 參考文章鏈接:關(guān)于Xcode編譯性能優(yōu)化的研究工作總結(jié) 一叔收、編譯時(shí)長(zhǎng)優(yōu)化Architectures 在Build ...
    夏天的風(fēng)_song閱讀 1,728評(píng)論 0 2
  • 什么是符號(hào)表? 符號(hào)表是內(nèi)存地址與函數(shù)名傲隶、文件名饺律、行號(hào)的映射表。符號(hào)表元素如下所示: <起始地址> <結(jié)束地址> ...
    深圳陽(yáng)光閱讀 12,176評(píng)論 28 5
  • 凍瑟都里鎮(zhèn)跺株,葉落老鐵山复濒。他鄉(xiāng)故岸,燈雨碎月漫空天乒省。忽念雪飄舊路巧颈,才有急行切語(yǔ)袖扛,舞墨祭當(dāng)年砸泛。做土桃花木,窗上稚燕還蛆封。...
    見(jiàn)龍君閱讀 270評(píng)論 1 0