書き込みしようとしなかったにもかかわらず、現時点では書き込みに問題がある(gdb経由で構造体のメンバーを見て確認した)RAM書き込みに関するCコードに問題がありますそのエリア。以下のようにRAM領域への書き出し
私の構造体が宣言されています:
typedef struct tcb {
unsigned int tid;
thread_state_t state;
pthread_t thread;
sem_t sema;
unsigned long interval;
unsigned long rtime;
} tcb_t ;
typedef struct node {
tcb_t *tcb;
} node;
typedef struct entry entry;
typedef struct entry {
entry *next;
entry *prev;
node node;
} entry;
これらの定義が提供されていると私はそれらを変更することはできません。 私は今、このコードでentry
の配列を初期化:
entry = malloc((num_threads) * sizeof(entry));
for (i = 0; i < num_threads; i++)
{
entry[i].next = NULL;
entry[i].prev = NULL;
entry[i].node.tcb = malloc(sizeof(tcb_t));
entry[i].node.tcb->tid = i;
entry[i].node.tcb->state = THREAD_RUNNABLE; //initialize value to show the scheduler this thread works for the first time
entry[i].node.tcb->interval = interval;
}
他のフィールドは、この時点で初期化することを意図していません。しかし、一度私のコードを実行すると、num_threads = 6
と言うと、entry[0].node.tcb->tid
の値は0の値を失いましたが、何か変なことがあります(私のポインタのように見えます)。
このフィールドにgdbでウォッチポイントを設定すると、entry[i].node.tcb = malloc(sizeof(tcb_t));
という行に私の値が上書きされたことが通知されます(この時点でi
は値2を保持しています)。どうしてこれなの?それはコンパイルされません -
gdb watchpointは 'entry [i] .node.tcb = malloc(sizeof(tcb_t));行にあなたに通知します;' what'の値は 'i'ですか? – CiaPan
'valgrind'はあなたを助けてくれるかもしれない –
iiの値はi = 2で通知されます。下にgdbの出力を投稿します(それはひどいかもしれません、ごめんねです) 255 entry [i] .node.tcb = malloc sizeof(tcb_t)); aufgabe_5.cのエントリ[0] .node.tcb-> TID 古い値= 0 新しい値= 6299888 メイン(ARGC = 3、ARGV = 0x7fffffffe688): (GDB)N ハードウェアウォッチポイント2 256 256エントリ[i] .node.tcb-> tid = i; (gdb)print i $ 1 = 2 – PfannkuchenXD