<code>#include <stdlib.h></code>
<code>#include <unistd.h></code>
<code>#include <sys/types.h></code>
<code>#include <sys/stat.h></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 <stdlib.h>
int main (int argc, char** argv ) {
execve("/bin/sh", NULL, NULL); // correct: execve("/bin/sh", <b>argv</b>, NULL);
}
<code>#include <stdio.h></code>
<code>#include <pthread.h></code>
<code>#include <string.h></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(&attr);</code>
<code> </code><code>pthread_mutexattr_settype(&attr,</code>
<code> </code><code>recursive ? PTHREAD_MUTEX_RECURSIVE : PTHREAD_MUTEX_ERRORCHECK );</code>
<code> </code><code>pthread_mutex_init(&d_mutex, &attr);</code>
<code> </code><code>pthread_mutexattr_destroy(&attr);</code>
<code> </code><code>}</code>
<code> </code><code>~Mutex() { pthread_mutex_destroy(&d_mutex); }</code>
<code> </code><code>void</code> <code>Lock() { pthread_mutex_lock(&d_mutex); }</code>
<code> </code><code>void</code> <code>Lock_Cancel() { pthread_testcancel(); pthread_mutex_lock(&d_mutex); }</code>
<code> </code><code>void</code> <code>Unlock() { pthread_mutex_unlock(&d_mutex); }</code>
<code> </code><code>bool</code> <code>TryLock() {</code><code>return</code> <code>pthread_mutex_trylock(&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<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(&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(&tid2, NULL, thr_fn, &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, &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, &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(&tid2, NULL, thr_fn2, &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(&tid2, NULL, thr_fn, &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 <_Z7thr_fn2Pv+8>: 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 ,如需轉載請自行聯系原作者