@@ -857,6 +857,43 @@ static void print_profiler_status(struct bpf_tracer *t, u64 iter_count,
857
857
h -> hit_hash_count , msg_h -> hit_hash_count );
858
858
}
859
859
860
+ /*
861
+ * View kernel addresses exposed via /proc and other interfaces
862
+ * when /proc/sys/kernel/kptr_restrict has the value 1, it is
863
+ * necessary to set the CAP_SYSLOG capability, otherwise all k-
864
+ * ernel addresses are set to 0.
865
+ *
866
+ * This function is used to check if the kernel address is 0.
867
+ */
868
+ static bool check_kallsyms_addr_is_zero (void )
869
+ {
870
+ const int check_num = 100 ;
871
+ const int max_line_len = 256 ;
872
+ const char * check_str = "0000000000000000" ;
873
+
874
+ FILE * file = fopen ("/proc/kallsyms" , "r" );
875
+ if (file == NULL ) {
876
+ ebpf_warning (LOG_CP_TAG "Error opening /proc/kallsyms" );
877
+ return false;
878
+ }
879
+
880
+ char line [max_line_len ];
881
+ int count = 0 ;
882
+
883
+ while (fgets (line , sizeof (line ), file ) != NULL && count < check_num ) {
884
+ char address [17 ]; // 16 characters + null terminator
885
+ sscanf (line , "%16s" , address );
886
+
887
+ if (strcmp (address , check_str ) == 0 ) {
888
+ count ++ ;
889
+ }
890
+ }
891
+
892
+ fclose (file );
893
+
894
+ return (count == check_num );
895
+ }
896
+
860
897
/*
861
898
* start continuous profiler
862
899
* @freq sample frequency, Hertz. (e.g. 99 profile stack traces at 99 Hertz)
@@ -880,6 +917,14 @@ int start_continuous_profiler(int freq,
880
917
return (-1 );
881
918
}
882
919
920
+ if (check_kallsyms_addr_is_zero ()) {
921
+ ebpf_warning (LOG_CP_TAG
922
+ "All kernel addresses in /proc/kallsyms are 0. Please add"
923
+ " 'CAP_SYSLOG' permission to the container to solve the "
924
+ "problem.\n" );
925
+ return (-1 );
926
+ }
927
+
883
928
atomic64_init (& process_lost_count );
884
929
885
930
profiler_stop = 0 ;
0 commit comments