忧虑是一种诅咒,用祝福代替你的忧虑

原文/肖飞

美国心理学家罗森塔尔曾经做过一个实验:他随机挑选了一所学校学生名单上的十几名学生,并告诉学校老师,"他们是一群有特殊能力的孩子,将来会有好成绩"。

这个"权威的谎言"被学校的顶尖教师视为真实。所以在接下来的几年里,所有的老师都对被选中的十几个孩子有不同的对待和感受,从他们的眼神、行为上向这些孩子传递出不同的信息。

忧虑是一种诅咒,用祝福代替你的忧虑

几年后,这十几个孩子真的比其他孩子有了更多的成绩和成绩。这就是心理学著名的"期望效应"。

这个实验表明,只要一个人长期传递信任、支持和期待的能量,就会为这个人带来正能量和勇往直前的勇气。最后,他被支持以非凡的精力取得成果。

而有些父母只是对孩子表现出过度的担忧,他们经常担心为什么其他孩子在爬山之前会跑自己的孩子;

忧虑是一种诅咒,用祝福代替你的忧虑

别人的孩子永远是自己认同的标准,生活在"别人的孩子"的诅咒中,最终他们的孩子真的像父母一样一直在说什么都没有,不如别人的孩子好。而父母自己长期存在的焦虑和担忧,也来自于无休止的比较。

心理学中有一句谚语说,"过度担心可能是一种诅咒"。长期焦虑引起的过度担忧会限制孩子的负能量。让孩子在长期比较、责备、默默叹中失去自信、自卑、怯懦、不自信。

忧虑是一种诅咒,用祝福代替你的忧虑

可悲的是,许多父母无法停止无休止地比较和担心。在看到孩子一步一步走向自己恐惧的样子,越来越亲近,甚至在我心底再次验证自己的担忧时,无奈的叹息"看!我是对的。"

内心的涟漪是如此残酷,以至于当人们用习惯性的认知和行动摧毁他们所爱的人时,它们是未知的。没有感觉好像你被迷住了。

忧虑是一种诅咒,用祝福代替你的忧虑

醒来!窮人自以為是,確信自己在做正確的事情,固執地認為他們知道一切,知道一切。解除诅咒,让孩子能在晴朗的天空下自由成长,幸福,不抑郁,自我发展。

让你的孩子在更多的祝福中逐渐完美。

~完~

(图片来自网络,原作者可以删除或联系撤回它们。谢谢,谢谢,再次感谢!)

祝福 诅咒

Linux Debugging(一): 使用反彙編了解C++程式函數調用棧

        拿到coredump後,如果看到的位址都是????,那麼基本上可以确定,程式的棧被破壞掉了。gdb也是使用函數的調用棧去還原“事故現場”的。是以了解函數調用棧,是使用gdb進行現場調試或者事後調試的基礎,如果不了解調用棧,基本上也從gdb得不到什麼有用的資訊。當然了,也有可能你非常“幸運”, 一個bt就把哪兒越界給标出來了。但是,大多數的時候你不夠幸運,通過log,通過簡單的code walkthrough,得不到哪兒出的問題;或者說隻是推測,不能确診。我們需要通過gdb來最終确定coredump産生的真正原因。

       本文還可以幫助你深入了解c++函數的局部變量。我們學習時知道局部變量是是存儲到棧裡的,記憶體管理對程式員是透明的。通過本文,你将明白這些結論是如何得出的。

       棧,是lifo(last in first out)的資料結構。c++的函數調用就是通過棧來傳遞參數,儲存函數傳回後下一步的執行位址。接下來我們通過一個具體的例子來探究。

可以使用以下指令将上述code程式設計成彙編代碼:

 g++ -g -s -o0 -m32 main.cpp -o-|c++filt >main.format.s

c++filt 是為了demangle symbols。-m32是為了編譯成x86-32的。因為對于x86-64來說,函數的參數是通過寄存器傳遞的。

main的彙編代碼:

對于call指令,這個指令有兩個作用:

<code>func0</code>函數調用完之後要傳回到<code>call</code>的下一條指令繼續執行,是以把<code>call</code>的下一條指令的位址壓棧,同時把<code>esp</code>的值減4。

修改程式計數器<code>eip</code>,跳轉到<code>func0</code>函數的開頭執行。

至此,調用func0的棧就是下面這個樣子:

Linux Debugging(一): 使用反彙編了解C++程式函數調用棧

下面看一下func0的彙編代碼:

需要注意的是esp也是留了5個位址空間給func0使用。并且ebp的下一個位址就是留給局部變量b的,調用棧如圖:

Linux Debugging(一): 使用反彙編了解C++程式函數調用棧

通過調用棧可以看出,8(%ebp)其實就是傳入的參數1234。

func1的代碼:

<code>leave</code>指令,這個指令是函數開頭的<code>push %ebp</code>和<code>mov %esp,%ebp</code>的逆操作:

把<code>ebp</code>的值賦給<code>esp</code>

現在<code>esp</code>所指向的棧頂儲存着<code>foo</code>函數棧幀的<code>ebp</code>,把這個值恢複給<code>ebp</code>,同時<code>esp</code>增加4。注意,現在esp指向的是這次調用的傳回位址,即上次調用的下一條執行指令。

最後是<code>ret</code>指令,它是<code>call</code>指令的逆操作:

現在<code>esp</code>所指向的棧頂儲存着傳回位址,把這個值恢複給<code>eip</code>,同時<code>esp</code>增加4,<code>esp指向了目前frame的棧頂</code>。

修改了程式計數器<code>eip</code>,是以跳轉到傳回位址繼續執行。

調用棧如下:

Linux Debugging(一): 使用反彙編了解C++程式函數調用棧

至此,func1傳回後,控制權交還給func0,目前的棧就退化成func0的棧的情況,因為棧儲存了一切資訊,是以指令繼續執行。直至func0執行

leave

ret

以同樣的方式将控制權交回給main。

     到這裡,你應該知道下面問題的答案了:

1. 局部變量的生命周期,

2. 局部變量是怎麼樣使用記憶體的;

3. 為什麼傳值不會改變原值(因為編譯器已經幫你做好拷貝了)

4. 為什麼會有棧溢出的錯誤

5. 為什麼有的寫壞棧的程式可以運作,而有的卻會crash(如果棧被破壞的是資料,那麼資料是髒的,不應該繼續運作;如果破壞的是上一層調用的bp,或者傳回位址,那麼程式會crash,or unexpected behaviour...)

    小節一下:

   1. 在32位的機器上,c++的函數調用的參數是存到棧上的。當然gcc可以在函數聲明中添加_attribute__((regparm(3)))使用eax, edx,ecx傳遞開頭三個參數。

   2. 通過bp可以通路到調用的參數值。

   3. 函數的傳回位址(函數傳回後的執行指令)也是存到棧上的,有目的的修改它可以使程式跳轉到它不應該的地方。。。

   4. 如果程式破壞了上一層的bp的位址,或者程式的傳回位址,那麼程式就很有可能crash

   5. 拿到一個coredump,應該首先先看有可能出問題的線程的的frame的棧是否完整。

   6. 64位的機器上,參數是通過寄存器傳遞的,當然寄存器不夠用就會通過棧來傳遞

支援原創,轉載請注明出處:anzhsoft  http://blog.csdn.net/anzhsoft/article/details/18730605