)]}'
{"src/rtos/NutOS.c":[{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":179,"context_line":"\t/* determine the number of current threads.*/"},{"line_number":180,"context_line":"\trtos-\u003ethread_count \u003d 0;"},{"line_number":181,"context_line":"\tint threadIdx \u003d 0;"},{"line_number":182,"context_line":"\tuint32_t thread_list_head \u003d rtos-\u003esymbols[NutOS_VAL_thread_list].address;"},{"line_number":183,"context_line":"\t/* Read nutThreadList pointer. */"},{"line_number":184,"context_line":"\tretval \u003d target_read_buffer("},{"line_number":185,"context_line":"\t\trtos-\u003etarget, thread_list_head + param-\u003ethread_next_offset,"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_b7bcf21b","line":182,"updated":"2016-12-26 23:18:59.000000000","message":"Why set this variable when it\u0027s overwritten just below? Leave it uninitialized and use the thread list address directly in the call below.","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":183,"context_line":"\t/* Read nutThreadList pointer. */"},{"line_number":184,"context_line":"\tretval \u003d target_read_buffer("},{"line_number":185,"context_line":"\t\trtos-\u003etarget, thread_list_head + param-\u003ethread_next_offset,"},{"line_number":186,"context_line":"\t\tparam-\u003epointer_width, (uint8_t *) \u0026thread_list_head);"},{"line_number":187,"context_line":"\tif (retval !\u003d ERROR_OK)"},{"line_number":188,"context_line":"\t\t\treturn retval;"},{"line_number":189,"context_line":"\tuint32_t thread_link \u003d thread_list_head;"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_f7b26a47","line":186,"range":{"start_line":186,"start_character":24,"end_line":186,"end_character":35},"updated":"2016-12-26 23:18:59.000000000","message":"Endianness bug. Use target_read_u32().","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":190,"context_line":"\tdo {"},{"line_number":191,"context_line":"\t\tretval \u003d target_read_buffer("},{"line_number":192,"context_line":"\t\t\trtos-\u003etarget, thread_link + param-\u003ethread_next_offset,"},{"line_number":193,"context_line":"\t\t\tparam-\u003epointer_width, (uint8_t *) \u0026thread_link);"},{"line_number":194,"context_line":"\t\tif (retval !\u003d ERROR_OK)"},{"line_number":195,"context_line":"\t\t\treturn retval;"},{"line_number":196,"context_line":"\t\tthreadIdx++;"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_d7af66dd","line":193,"range":{"start_line":193,"start_character":25,"end_line":193,"end_character":37},"updated":"2016-12-26 23:18:59.000000000","message":"Bug here too","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":203,"context_line":"\tretval \u003d target_read_buffer(rtos-\u003etarget,"},{"line_number":204,"context_line":"\t\t\trtos-\u003esymbols[NutOS_VAL_current_thread_ptr].address,"},{"line_number":205,"context_line":"\t\t\t4,"},{"line_number":206,"context_line":"\t\t\t(uint8_t *)\u0026rtos-\u003ecurrent_thread);"},{"line_number":207,"context_line":"\tif (retval !\u003d ERROR_OK) {"},{"line_number":208,"context_line":"\t\tLOG_ERROR(\"Could not read NutOS current thread from target\");"},{"line_number":209,"context_line":"\t\treturn retval;"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_578b7672","line":206,"range":{"start_line":206,"start_character":3,"end_line":206,"end_character":14},"updated":"2016-12-26 23:18:59.000000000","message":"Bug","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":208,"context_line":"\t\tLOG_ERROR(\"Could not read NutOS current thread from target\");"},{"line_number":209,"context_line":"\t\treturn retval;"},{"line_number":210,"context_line":"\t}"},{"line_number":211,"context_line":"\tif ((threadIdx  \u003d\u003d 0) || (rtos-\u003ecurrent_thread \u003d\u003d 0)) {"},{"line_number":212,"context_line":"\t\tLOG_ERROR(\"NutOS startup\");"},{"line_number":213,"context_line":"\t\tchar tmp_str[] \u003d \"Current Execution\";"},{"line_number":214,"context_line":"\t\trtos-\u003ethread_details \u003d malloc("}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_77867a6c","line":211,"range":{"start_line":211,"start_character":5,"end_line":211,"end_character":22},"updated":"2016-12-26 23:18:59.000000000","message":"I don\u0027t think threadIdx can be zero here...? Not sure if that\u0027s a fact or if it is a bug in the logic above.\n\nActually, if there really were zero threads, I guess the above logic would fail since it never checks if thread_list_head is 0. I guess the loop should be while (thread_link) {...} instead of do {...} while (thread_link).","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":211,"context_line":"\tif ((threadIdx  \u003d\u003d 0) || (rtos-\u003ecurrent_thread \u003d\u003d 0)) {"},{"line_number":212,"context_line":"\t\tLOG_ERROR(\"NutOS startup\");"},{"line_number":213,"context_line":"\t\tchar tmp_str[] \u003d \"Current Execution\";"},{"line_number":214,"context_line":"\t\trtos-\u003ethread_details \u003d malloc("},{"line_number":215,"context_line":"\t\t\t\tsizeof(struct thread_detail) * 1);"},{"line_number":216,"context_line":"\t\trtos-\u003ethread_details-\u003ethreadid \u003d 1;"},{"line_number":217,"context_line":"\t\trtos-\u003ethread_details-\u003eexists \u003d true;"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_b793d2a5","line":214,"range":{"start_line":214,"start_character":25,"end_line":214,"end_character":31},"updated":"2016-12-26 23:18:59.000000000","message":"calloc to make sure future fields are not left uninitialized.","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":216,"context_line":"\t\trtos-\u003ethread_details-\u003ethreadid \u003d 1;"},{"line_number":217,"context_line":"\t\trtos-\u003ethread_details-\u003eexists \u003d true;"},{"line_number":218,"context_line":"\t\trtos-\u003ethread_details-\u003eextra_info_str \u003d NULL;"},{"line_number":219,"context_line":"\t\trtos-\u003ethread_details-\u003ethread_name_str \u003d malloc(sizeof(tmp_str));"},{"line_number":220,"context_line":"\t\tstrcpy(rtos-\u003ethread_details-\u003ethread_name_str, tmp_str);"},{"line_number":221,"context_line":"\t\trtos-\u003ethread_count \u003d 1;"},{"line_number":222,"context_line":"\t\treturn ERROR_OK;"},{"line_number":223,"context_line":"\t}"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_d7964697","line":220,"range":{"start_line":219,"start_character":42,"end_line":220,"end_character":57},"updated":"2016-12-26 23:18:59.000000000","message":"strdup(\"Current Execution\");","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":238,"context_line":"\t\tif (details-\u003ethread_name_str) {"},{"line_number":239,"context_line":"\t\t\tretval \u003d target_read_buffer("},{"line_number":240,"context_line":"\t\t\t\trtos-\u003etarget, thread_link + param-\u003ethread_name_offset,"},{"line_number":241,"context_line":"\t\t\t\t9, (uint8_t *) details-\u003ethread_name_str);"},{"line_number":242,"context_line":"\t\t\tif (retval !\u003d ERROR_OK)"},{"line_number":243,"context_line":"\t\t\t\treturn retval;"},{"line_number":244,"context_line":"\t\t} else {"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_77ed5a22","line":241,"range":{"start_line":241,"start_character":4,"end_line":241,"end_character":5},"updated":"2016-12-26 23:18:59.000000000","message":"NUTOS_MAX_THREAD_NAME_STR_SIZE?\n\nAlso, don\u0027t rely on the string in target memory being NUL-terminated.","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":242,"context_line":"\t\t\tif (retval !\u003d ERROR_OK)"},{"line_number":243,"context_line":"\t\t\t\treturn retval;"},{"line_number":244,"context_line":"\t\t} else {"},{"line_number":245,"context_line":"\t\t\tLOG_ERROR(\"Calloc failed\\n\");"},{"line_number":246,"context_line":"\t\t}"},{"line_number":247,"context_line":"\t\tretval \u003d target_read_buffer("},{"line_number":248,"context_line":"\t\t\trtos-\u003etarget, thread_link + param-\u003ethread_state_offset,"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_57f25604","line":245,"updated":"2016-12-26 23:18:59.000000000","message":"It\u0027s malloc above. But the message is pointless because if the allocation failed we could hardly print it.","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":247,"context_line":"\t\tretval \u003d target_read_buffer("},{"line_number":248,"context_line":"\t\t\trtos-\u003etarget, thread_link + param-\u003ethread_state_offset,"},{"line_number":249,"context_line":"\t\t\t1, \u0026state);"},{"line_number":250,"context_line":"\t\tdetails-\u003eextra_info_str \u003d malloc(sizeof(NutOS_thread_states[state]));"},{"line_number":251,"context_line":"\t\tif (details-\u003eextra_info_str)"},{"line_number":252,"context_line":"\t\t\tstrcpy(details-\u003eextra_info_str, NutOS_thread_states[state]);"},{"line_number":253,"context_line":"\t\t/* Read next linked state. */"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_37f7e2f4","line":250,"range":{"start_line":250,"start_character":35,"end_line":250,"end_character":69},"updated":"2016-12-26 23:18:59.000000000","message":"This isn\u0027t the right amount of memory, strlen() is more appropriate. But really, just use strdup(NutOS_thread_states[state])...","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":253,"context_line":"\t\t/* Read next linked state. */"},{"line_number":254,"context_line":"\t\tretval \u003d target_read_buffer("},{"line_number":255,"context_line":"\t\t\trtos-\u003etarget, thread_link + param-\u003ethread_next_offset,"},{"line_number":256,"context_line":"\t\t\tparam-\u003epointer_width, (uint8_t *) \u0026thread_link);"},{"line_number":257,"context_line":"\t\tif (retval !\u003d ERROR_OK)"},{"line_number":258,"context_line":"\t\t\treturn retval;"},{"line_number":259,"context_line":"\t}"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_17fcded4","line":256,"range":{"start_line":256,"start_character":25,"end_line":256,"end_character":36},"updated":"2016-12-26 23:18:59.000000000","message":"Bug","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":285,"context_line":"\t\tstacking_info \u003d param-\u003estacking_info_M0;"},{"line_number":286,"context_line":"\telse"},{"line_number":287,"context_line":"\t\tstacking_info \u003d param-\u003estacking_info_M3;"},{"line_number":288,"context_line":"\tuint32_t thread_list_ptr \u003d rtos-\u003esymbols[NutOS_VAL_thread_list].address;"},{"line_number":289,"context_line":"\tuint32_t thread_list_head;"},{"line_number":290,"context_line":"\tretval \u003d target_read_buffer("},{"line_number":291,"context_line":"\t\trtos-\u003etarget, thread_list_ptr,"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_d7dd2675","line":288,"range":{"start_line":288,"start_character":10,"end_line":288,"end_character":25},"updated":"2016-12-26 23:18:59.000000000","message":"Why this variable? Just use the symbol address in the call below.","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":288,"context_line":"\tuint32_t thread_list_ptr \u003d rtos-\u003esymbols[NutOS_VAL_thread_list].address;"},{"line_number":289,"context_line":"\tuint32_t thread_list_head;"},{"line_number":290,"context_line":"\tretval \u003d target_read_buffer("},{"line_number":291,"context_line":"\t\trtos-\u003etarget, thread_list_ptr,"},{"line_number":292,"context_line":"\t\tparam-\u003epointer_width, (uint8_t *) \u0026thread_list_head);"},{"line_number":293,"context_line":"\tif (retval !\u003d ERROR_OK)"},{"line_number":294,"context_line":"\t\treturn retval;"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_b7eab203","line":291,"range":{"start_line":291,"start_character":16,"end_line":291,"end_character":32},"updated":"2016-12-26 23:18:59.000000000","message":"Missing the thread_next_offset","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":289,"context_line":"\tuint32_t thread_list_head;"},{"line_number":290,"context_line":"\tretval \u003d target_read_buffer("},{"line_number":291,"context_line":"\t\trtos-\u003etarget, thread_list_ptr,"},{"line_number":292,"context_line":"\t\tparam-\u003epointer_width, (uint8_t *) \u0026thread_list_head);"},{"line_number":293,"context_line":"\tif (retval !\u003d ERROR_OK)"},{"line_number":294,"context_line":"\t\treturn retval;"},{"line_number":295,"context_line":"\tdo {"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_f7e02a27","line":292,"range":{"start_line":292,"start_character":24,"end_line":292,"end_character":35},"updated":"2016-12-26 23:18:59.000000000","message":"Bug","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":293,"context_line":"\tif (retval !\u003d ERROR_OK)"},{"line_number":294,"context_line":"\t\treturn retval;"},{"line_number":295,"context_line":"\tdo {"},{"line_number":296,"context_line":"\t\tif (thread_list_head \u003d\u003d thread_id)"},{"line_number":297,"context_line":"\t\t\tbreak;"},{"line_number":298,"context_line":"\t\t/* Read next linked NUTTHREADINFO */"},{"line_number":299,"context_line":"\t\tretval \u003d target_read_buffer("}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_37cec2ba","line":296,"updated":"2016-12-26 23:18:59.000000000","message":"Since the thread_id is supposed to be the target address of the corresponding thread structure we could potentially avoid scanning the thread list on the target again and just get the stack pointer directly from thread_id + param-\u003ethread_stack_offset.\n\nAlthough it doesn\u0027t look like the rtos layer currently validates the thread id from GDB against the thread list so if GDB gives us garbage we\u0027ll return garbage (or fail). A validation should probably be added there so we can rely on the thread id being sane here.\n\nAnyway even if we wan\u0027t to to validation here, assuming the thread list has been updated between target halt and this function (I think it should be but it\u0027s not super clear), I guess we could just as well scan the local thread list in rtos-\u003ethread_details[] instead of going out to the target.","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":298,"context_line":"\t\t/* Read next linked NUTTHREADINFO */"},{"line_number":299,"context_line":"\t\tretval \u003d target_read_buffer("},{"line_number":300,"context_line":"\t\t\trtos-\u003etarget, thread_list_head + param-\u003ethread_next_offset,"},{"line_number":301,"context_line":"\t\t\tparam-\u003epointer_width, (uint8_t *) \u0026thread_list_head);"},{"line_number":302,"context_line":"\t\tif (retval !\u003d ERROR_OK)"},{"line_number":303,"context_line":"\t\t\treturn retval;"},{"line_number":304,"context_line":"\t} while (thread_list_head);"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_77d43a4c","line":301,"range":{"start_line":301,"start_character":25,"end_line":301,"end_character":36},"updated":"2016-12-26 23:18:59.000000000","message":"Bug","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"},{"author":{"_account_id":1000005,"name":"Andreas Fritiofson","email":"andreas.fritiofson@gmail.com","username":"Nattgris"},"change_message_id":"2ff65ff3142cd6a8671a368911e3955ecf1e53a7","unresolved":false,"context_lines":[{"line_number":309,"context_line":"\t/* Read the stack pointer */"},{"line_number":310,"context_line":"\tretval \u003d target_read_buffer("},{"line_number":311,"context_line":"\t\trtos-\u003etarget, thread_list_head + param-\u003ethread_stack_offset,"},{"line_number":312,"context_line":"\t\tparam-\u003epointer_width, (uint8_t *) \u0026stack_ptr);"},{"line_number":313,"context_line":"\tif (retval !\u003d ERROR_OK) {"},{"line_number":314,"context_line":"\t\tLOG_ERROR(\"Error reading stack frame from NutOS thread\");"},{"line_number":315,"context_line":"\t\treturn retval;"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"ce57fb0e_57d93682","line":312,"range":{"start_line":312,"start_character":24,"end_line":312,"end_character":35},"updated":"2016-12-26 23:18:59.000000000","message":"Bug","commit_id":"f9782be7e15aee46d71ff09b3bb051d29f71e62a"}]}
