天天看點

[Advance] How to debug a program (下):示例



<code>#include &lt;stdlib.h&gt;</code>

<code>#include &lt;unistd.h&gt;</code>

<code>#include &lt;sys/types.h&gt;</code>

<code>#include &lt;sys/stat.h&gt;</code>

<code>int</code> <code>Add(</code><code>int</code> <code>a,</code><code>int</code> <code>b,</code><code>int</code> <code>c){</code>

<code>    </code><code>int</code> <code>arr[4] = {0};</code>

<code>    </code><code>arr[0] = a;</code>

<code>    </code><code>arr[1] = b;</code>

<code>    </code><code>arr[2] = c;</code>

<code>    </code><code>arr[3] = a+b+c;</code>

<code>    </code><code>return</code> <code>arr[3];</code>

<code>}</code>

<code>int</code> <code>main() {</code>

<code>    </code><code>int</code> <code>a = 0x100;</code>

<code>    </code><code>int</code> <code>b = 0x200;</code>

<code>    </code><code>int</code> <code>c = 0x345;</code>

<code>    </code><code>Add(a,b,c);</code>

<code>    </code><code>return</code> <code>1;</code>

  gdb ./test

#include &lt;stdlib.h&gt;

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

  execve("/bin/sh", NULL, NULL); // correct: execve("/bin/sh", <b>argv</b>, NULL);

}

<code>#include &lt;stdio.h&gt;</code>

<code>#include &lt;pthread.h&gt;</code>

<code>#include &lt;string.h&gt;</code>

<code>pthread_t ntid;</code>

<code>class</code> <code>Mutex</code>

<code>{</code>

<code>public</code><code>:</code>

<code>    </code><code>Mutex(</code><code>bool</code> <code>recursive =</code><code>false</code><code>) {</code>

<code>    </code><code>pthread_mutexattr_t attr;</code>

<code>    </code><code>pthread_mutexattr_init(&amp;attr);</code>

<code>    </code><code>pthread_mutexattr_settype(&amp;attr,</code>

<code>        </code><code>recursive ?  PTHREAD_MUTEX_RECURSIVE : PTHREAD_MUTEX_ERRORCHECK );</code>

<code>    </code><code>pthread_mutex_init(&amp;d_mutex, &amp;attr);</code>

<code>    </code><code>pthread_mutexattr_destroy(&amp;attr);</code>

<code>    </code><code>}</code>

<code>    </code><code>~Mutex() { pthread_mutex_destroy(&amp;d_mutex); }</code>

<code>    </code><code>void</code> <code>Lock() { pthread_mutex_lock(&amp;d_mutex); }</code>

<code>    </code><code>void</code> <code>Lock_Cancel() {  pthread_testcancel(); pthread_mutex_lock(&amp;d_mutex); }</code>

<code>    </code><code>void</code> <code>Unlock() { pthread_mutex_unlock(&amp;d_mutex); }</code>

<code>    </code><code>bool</code> <code>TryLock() {</code><code>return</code> <code>pthread_mutex_trylock(&amp;d_mutex) == 0; }</code>

<code>private</code><code>:</code>

<code>    </code><code>pthread_mutex_t d_mutex;</code>

<code>};</code>

<code>void</code> <code>printids(</code><code>const</code> <code>char</code> <code>*s)</code>

<code>    </code><code>pid_t       pid;</code>

<code>    </code><code>pthread_t   tid;</code>

<code>    </code><code>pid = getpid();</code>

<code>    </code><code>tid = pthread_self();</code>

<code>    </code><code>printf</code><code>(</code><code>"%s pid %u tid %u (0x%x)\n"</code><code>, s, (unsigned</code><code>int</code><code>)pid,</code>

<code>            </code><code>(unsigned</code><code>int</code><code>)tid, (unsigned</code><code>int</code><code>)tid);</code>

<code>Mutex locker, locker2;</code>

<code>void</code> <code>* thr_fn(</code><code>void</code> <code>*arg)</code>

<code>    </code><code>int</code> <code>count = 1000;</code>

<code>    </code><code>if</code><code>(arg != NULL)</code>

<code>        </code><code>count = *((</code><code>int</code><code>*)arg);</code>

<code>    </code><code>locker.Lock();</code>

<code>    </code><code>int</code> <code>i=0;</code>

<code>    </code><code>for</code><code>(i=0; i&lt;count; ++i)</code>

<code>    </code><code>{</code>

<code>        </code><code>printf</code><code>(</code><code>"Func 1 Time %d : "</code><code>, i);</code>

<code>        </code><code>locker2.Lock();</code>

<code>        </code><code>printids(</code><code>"new thread: "</code><code>);</code>

<code>        </code><code>sleep(1);</code>

<code>        </code><code>locker2.Unlock();</code>

<code>    </code><code>locker.Unlock();</code>

<code>    </code><code>return</code><code>((</code><code>void</code> <code>*)0);</code>

<code>int</code> <code>main(</code><code>void</code><code>)</code>

<code>    </code><code>int</code> <code>err;</code>

<code>    </code><code>pthread_t tid1, tid2;</code>

<code>    </code><code>void</code><code>* tret;</code>

<code>    </code><code>int</code> <code>count = 10;</code>

<code>    </code><code>printf</code><code>(</code><code>"PID=%d\n"</code><code>, getpid());</code>

<code>    </code><code>// thread 1</code>

<code>    </code><code>err = pthread_create(&amp;tid1, NULL, thr_fn, NULL);</code>

<code>    </code><code>if</code> <code>(err != 0)</code>

<code>        </code><code>printf</code><code>(</code><code>"can't create thread : %s\n"</code><code>,</code><code>strerror</code><code>(err));</code>

<code>    </code><code>printf</code><code>(</code><code>"Create thread 1 : %u \n"</code><code>, (unsigned</code><code>int</code><code>)tid1);</code>

<code>    </code><code>// thread 2</code>

<code>    </code><code>err = pthread_create(&amp;tid2, NULL, thr_fn, &amp;count);</code>

<code>    </code><code>printf</code><code>(</code><code>"Create thread 2 : %u \n"</code><code>, (unsigned</code><code>int</code><code>)tid2);</code>

<code>    </code><code>printids(</code><code>"main thread:"</code><code>);</code>

<code>    </code><code>sleep(1);</code>

<code>    </code><code>pthread_cancel(tid1);</code>

<code>    </code><code>printf</code><code>(</code><code>"Cancel thread 1\n"</code><code>);</code>

<code>    </code><code>err = pthread_join(tid1, &amp;tret);</code>

<code>        </code><code>printf</code><code>(</code><code>"can't join with thread 1: %s\n"</code><code>,</code><code>strerror</code><code>(err));</code>

<code>printf</code><code>(</code><code>"thread 1 exit code %d\n"</code><code>, (</code><code>int</code><code>)tret);</code>

<code>    </code><code>err = pthread_join(tid2, &amp;tret);</code>

<code>        </code><code>printf</code><code>(</code><code>"can't join with thread 2: %s\n"</code><code>,</code><code>strerror</code><code>(err));</code>

<code>    </code><code>printf</code><code>(</code><code>"thread 2 exit code %d\n"</code><code>, (</code><code>int</code><code>)tret);</code>

<code>    </code><code>return</code> <code>0;</code>

<code>void</code> <code>* thr_fn2(</code><code>void</code> <code>*arg)</code>

<code>    </code><code>locker2.Lock();</code>

<code>        </code><code>printf</code><code>(</code><code>"Func2 Time %d : "</code><code>, i);</code>

<code>        </code><code>locker.Lock();</code>

<code>        </code><code>locker.Unlock();</code>

<code>    </code><code>locker2.Unlock();</code>

<code>    </code><code>err = pthread_create(&amp;tid2, NULL, thr_fn2, &amp;count);</code>

<code>    </code><code>// pthread_cancel(tid1);</code>

<code>    </code><code>// printf("Cancel thread 1\n");</code>

<code>    </code><code>printf</code><code>(</code><code>"thread 1 exit code %d\n"</code><code>, (</code><code>int</code><code>)tret);</code>

<code>    </code><code>/* err = pthread_create(&amp;tid2, NULL, thr_fn, &amp;count);</code>

<code>    </code><code>if (err != 0)</code>

<code>        </code><code>printf("can't create thread : %s\n", strerror(err));</code>

<code>    </code><code>printf("Create thread 2 : %u \n", (unsigned int)tid2);      */</code>

<code>    </code><code>////////////////////////////////</code>

Shell 1:

0x400b6e &lt;_Z7thr_fn2Pv+8&gt;:      mov    %rdi,0xfffffffffffffff8(%rbp)

 Thus we know function<b> thr_fn and thr_fn2 </b>is dead-lock!

本文轉自 zhenjing 部落格園部落格,原文連結: http://www.cnblogs.com/zhenjing/archive/2011/03/23/advance_debug2.html ,如需轉載請自行聯系原作者

繼續閱讀